Keys and Scope

Hi everyone,

I'm new to XML and keep getting the feeling that everything is upside-down from my normal understanding of scope.

I have a Schema defined:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema2"
                targetNamespace="http://tempuri.org/XMLSchema2.xsd"
                elementFormDefault="qualified"
                xmlns:s="http://tempuri.org/XMLSchema2.xsd"
                xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="Section" type="s:SectionType">
                <xs:key name="DefinitionKey">
                        <xs:selector xpath="s:Define"/>
                        <xs:field xpath="@name"/>
                </xs:key>
                <xs:keyref name="DefinitionRef" refer="s:DefinitionKey">
                        <xs:selector xpath="s:Refer"/>
                        <xs:field xpath="@ref"/>
                </xs:keyref>
        </xs:element>
        <xs:complexType name="SectionType" mixed="true">
                <xs:sequence minOccurs="1" maxOccurs="1">
                        <xs:sequence minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="Define" type="s:DefineType"/>
                        </xs:sequence>
                        <xs:choice minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="Refer" type="s:ReferType"/>
                                <xs:element ref="s:Section"/>
                        </xs:choice>
                </xs:sequence>
        </xs:complexType>
        <xs:complexType name="DefineType">
                <xs:complexContent>
                        <xs:extension base="s:SectionType">
                                <xs:attribute name="name" type="xs:string"/>
                        </xs:extension>
                </xs:complexContent>
        </xs:complexType>
        <xs:complexType name="ReferType">
                <xs:complexContent>
                        <xs:extension base="s:SectionType">
                                <xs:attribute name="ref" type="xs:string"/>
                        </xs:extension>
                </xs:complexContent>
        </xs:complexType>
</xs:schema>

I have the following instance document:

<?xml version="1.0" encoding="utf-8" ?>
<Section xmlns="http://tempuri.org/XMLSchema2.xsd">
        <Define name="one"/>
        <Refer ref="one"/> <!-- Allow: defined in current node. -->
        <Refer ref="two"/> <!-- Error: not defined in current or ancestor node. -->
        <Section>
                <Define name="two"/>
                <Refer ref="one"/> <!-- Allow: defined in ancestor node. -->
                <Refer ref="two"/> <!-- Allow: defined in current node. -->
        </Section>
</Section>

I would like to define the keys and keyrefs in the schema such that I can enforce the rules in the comments above, but I'm not finding a way to do this.

Basically, I'm thinking of a node and all it's child nodes as my scope, and would like to Refer to anything Defined in the same scope, but disallow any References to things Defined out of scope.

The closest I've been able to come is the reverse, where I can Refer to anything Defined in the current or any descendant node, by changing:

                <xs:key name="DefinitionKey">
                        <xs:selector xpath=".//s:Define"/>
                        <xs:field xpath="@name"/>
                </xs:key>

Am I hopelessly stuck in a mindset that just doesn't work with XML?  Or is there an obvious solution I'm just overlooking?

Any help would be greatly appreciated.

Thanks,
Matt Knowles

Received on Tuesday, 11 November 2008 15:26:14 UTC