XML
Beginner
2 min read
XSD Complex Types, Keys, and References
Example
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="store">
<xs:complexType>
<xs:sequence>
<xs:element name="products">
<xs:complexType>
<xs:sequence>
<xs:element name="product" type="ProductType"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="orders">
<xs:complexType>
<xs:sequence>
<xs:element name="order" type="OrderType"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- Key: product/@id must be unique and non-null -->
<xs:key name="productKey">
<xs:selector xpath="products/product"/>
<xs:field xpath="@id"/>
</xs:key>
<!-- Keyref: order/item/@productId must reference a product key -->
<xs:keyref name="orderItemRef" refer="productKey">
<xs:selector xpath="orders/order/item"/>
<xs:field xpath="@productId"/>
</xs:keyref>
</xs:element>
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="OrderType">
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="productId" type="xs:string" use="required"/>
<xs:attribute name="qty" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderId" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>