Xml Schema: Extending base root element with unique/key/keyref element.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • icesign
    New Member
    • Aug 2009
    • 5

    Xml Schema: Extending base root element with unique/key/keyref element.

    I know that the selector of these elements has a scope relative to the element being declared, but maybe there is a way to get beyond bounds of this scope or maybe just a way to extend base element?
    Here’s a working example:
    Code:
    <xs:schema id="schema"
        targetNamespace="http://tempuri.org/schema.xsd"
        elementFormDefault="qualified"
        xmlns="http://tempuri.org/schema.xsd"
        xmlns:mstns="http://tempuri.org/schema.xsd"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">
    	
    	<xs:element name="element" abstract="true" type="TElement"/>
    	<xs:element name="local" type="TLocal" substitutionGroup="element"/>
    
    	<xs:element name="root" type="TRoot">
    		<!--declaring constraint within TRoot (root element of any document)-->
    		<xs:unique name="local-name-constraint">
    			<xs:selector xpath=".//mstns:local"/>
    			<xs:field xpath="@name"/>
    		</xs:unique>
    	</xs:element>
    
    	<xs:complexType name="TElement" abstract="true">
    	</xs:complexType>
    
    	<xs:complexType name="TRoot">
    		<xs:complexContent>
    			<xs:extension base="TElement">
    				<xs:sequence>
    					<xs:element ref="element" maxOccurs="unbounded"/>
    				</xs:sequence>
    			</xs:extension>
    		</xs:complexContent>
    	</xs:complexType>
    
    	<xs:complexType name="TLocal">
    		<xs:complexContent>
    			<xs:extension base="TElement">
    				<xs:sequence>
    					<xs:element ref="element" minOccurs="0" maxOccurs="unbounded"/>
    				</xs:sequence>
    				<xs:attribute name="name" use="required" type="xs:string"/>
    			</xs:extension>
    		</xs:complexContent>
    	</xs:complexType>
    </xs:schema>
    …and XML document
    Code:
    <root xmlns="http://tempuri.org/schema.xsd">
    	<local name="a"/>
    	<local name="b">
    		<local name="a"/>
    	</local>
    </root>
    It works and I’ve got notified that there is a duplicate key sequence. But what if I have an extension to this schema where I declared another element:
    Code:
    <root xmlns="http://tempuri.org/schema.xsd"
    	  xmlns:e="http://tempuri.org/ext.xsd">
    	<local name="one">
    		<e:extended key="next"/>
    	</local>
    	<local name="two">
    		<local name="one"/>
    		<e:extended key="next"/>
    	</local>
    </root>
    Code:
    <xs:schema id="ext"
        targetNamespace="http://tempuri.org/ext.xsd"
        elementFormDefault="qualified"
        xmlns="http://tempuri.org/ext.xsd"
        xmlns:mstns="http://tempuri.org/ext.xsd"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
    	xmlns:base="http://tempuri.org/schema.xsd"
    >
    
    	<xs:import namespace="http://tempuri.org/schema.xsd"
    			   schemaLocation="schema.xsd"/>
    
    	<xs:element name="extended" type="TExtended" substitutionGroup="base:element">
    		<xs:unique name="extended-key-constraint">
    			<xs:selector xpath="I can't get to the root of the document here"/>
    			<xs:field xpath="@key"/>
    		</xs:unique>
    	</xs:element>
    	
    	<xs:complexType name="TExtended">
    		<xs:complexContent>
    			<xs:extension base="base:TElement">
    				<xs:sequence>
    					<xs:element ref="base:element" minOccurs="0" maxOccurs="unbounded"/>
    				</xs:sequence>
    				<xs:attribute name="key" use="required" type="xs:string"/>
    			</xs:extension>
    		</xs:complexContent>
    	</xs:complexType>
    
    </xs:schema>
    How can I set uniqueness to the element from the schema extensions?
Working...