Here’s a working example:
Expand|Select|Wrap|Line Numbers
- <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>
Expand|Select|Wrap|Line Numbers
- <root xmlns="http://tempuri.org/schema.xsd">
- <local name="a"/>
- <local name="b">
- <local name="a"/>
- </local>
- </root>
Expand|Select|Wrap|Line Numbers
- <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>
Expand|Select|Wrap|Line Numbers
- <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>