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:
…and XML document
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:
How can I set uniqueness to the element from the schema extensions?
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>
Code:
<root xmlns="http://tempuri.org/schema.xsd"> <local name="a"/> <local name="b"> <local name="a"/> </local> </root>
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>