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:
- <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
- <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:
- <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>
- <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?