Chapter 17

Identity constraints

Binding Test

Schema

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:annotation>
    <xsd:documentation>
      This example illustrates identity constraints.  Each child of items must have a number attribute whose value is unique within order.  All product descendents of order must have a number child whose value matches one of these unique product numbers.
    </xsd:documentation>
  </xsd:annotation>

  <xsd:element name="order" type="OrderType">
    <xsd:keyref name="prodNumKeyRef" refer="prodNumKey">
      <xsd:selector xpath="items/*"/>
      <xsd:field xpath="@number"/>
    </xsd:keyref>
    <xsd:key name="prodNumKey">
      <xsd:selector xpath=".//product"/>
      <xsd:field xpath="number"/>
    </xsd:key>
  </xsd:element>

  <xsd:complexType name="OrderType">
    <xsd:sequence>
      <xsd:element name="number" type="xsd:string"/>
      <xsd:element name="items" type="ItemsType"/>
      <xsd:element name="products" type="ProductsType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="ItemsType">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="shirt" type="ProductOrderType"/>
      <xsd:element name="hat" type="ProductOrderType"/>
    </xsd:choice>
  </xsd:complexType>

  <xsd:complexType name="ProductOrderType">
    <xsd:sequence>
      <xsd:element name="quantity" type="xsd:integer"/>
      <xsd:element name="color" type="ColorType" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="number" type="xsd:integer"/>
  </xsd:complexType>

  <xsd:complexType name="ProductsType">
    <xsd:sequence>
      <xsd:element name="product" type="ProductType" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="ProductType">
    <xsd:sequence>
      <xsd:element name="number" type="xsd:integer"/>
      <xsd:element name="name" type="xsd:string"/>
      <xsd:element name="price" type="PriceType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="ColorType">
    <xsd:attribute name="value" type="xsd:string"/>
  </xsd:complexType>

  <xsd:complexType name="PriceType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:decimal">
        <xsd:attribute name="currency" type="xsd:token"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

</xsd:schema>

XML Document

<order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="chapter17.xsd">
  <number>123ABBCC123</number>
  <items>
    <shirt number="557">
      <quantity>1</quantity>
      <color value="blue"/>
    </shirt>
    <shirt number="557">
      <quantity>1</quantity>
      <color value="sage"/>
    </shirt>
    <hat number="563">
      <quantity>1</quantity>
    </hat>
  </items>
  <products>
    <product>
      <number>557</number>
      <name>Short-Sleeved Linen Blouse</name>
      <price currency="USD">29.99</price>
    </product>
    <product>
      <number>563</number>
      <name>Ten-Gallon Hat</name>
      <price currency="USD">69.99</price>
    </product>
  </products>
</order>

xsData XML Document

<order>
  <number>123ABBCC123</number>
  <items>
    <shirt number="557">
      <quantity>1</quantity>
      <color value="blue"/>
    </shirt>
    <shirt number="557">
      <quantity>1</quantity>
      <color value="sage"/>
    </shirt>
    <hat number="563">
      <quantity>1</quantity>
    </hat>
  </items>
  <products>
    <product>
      <number>557</number>
      <name>Short-Sleeved Linen Blouse</name>
      <price currency="USD">29.99</price>
    </product>
    <product>
      <number>563</number>
      <name>Ten-Gallon Hat</name>
      <price currency="USD">69.99</price>
    </product>
  </products>
</order>

xsData JSON

{
    "number": "123ABBCC123",
    "items": {
        "shirt": [
            {
                "quantity": 1,
                "color": {
                    "value": "blue"
                },
                "number": 557
            },
            {
                "quantity": 1,
                "color": {
                    "value": "sage"
                },
                "number": 557
            }
        ],
        "hat": [
            {
                "quantity": 1,
                "color": null,
                "number": 563
            }
        ]
    },
    "products": {
        "product": [
            {
                "number": 557,
                "name": "Short-Sleeved Linen Blouse",
                "price": {
                    "value": "29.99",
                    "currency": "USD"
                }
            },
            {
                "number": 563,
                "name": "Ten-Gallon Hat",
                "price": {
                    "value": "69.99",
                    "currency": "USD"
                }
            }
        ]
    }
}

Example 17-13 Referencing an identity constraint in a restriction

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://datypic.com/prod" xmlns="http://datypic.com/prod" xpathDefaultNamespace="http://datypic.com/prod">
    <xs:include  schemaLocation="../chapter15/example1515.xsd" />
    <xs:complexType name="CatalogListType">
    <xs:sequence>
      <xs:element name="catalog" type="CatalogType" maxOccurs="unbounded">
        <xs:unique name="dateAndProdNumKey">
          <xs:selector xpath="department/product" />
          <xs:field xpath="number" />
          <xs:field xpath="@effDate" />
        </xs:unique>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="RestrictedCatalogListType">
    <xs:complexContent>
      <xs:restriction base="CatalogListType">
        <xs:sequence>
          <xs:element name="catalog" type="CatalogType" maxOccurs="1">
            <xs:unique ref="dateAndProdNumKey" />
          </xs:element>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import List, Optional
from tests.fixtures.defxmlschema.chapter15.example1515 import (
    CatalogType,
)

__NAMESPACE__ = "http://datypic.com/prod"


@dataclass
class CatalogListType:
    """
    :ivar catalog:
    """
    catalog: List[CatalogType] = field(
        default_factory=list,
        metadata=dict(
            type="Element",
            namespace="",
            min_occurs=1,
            max_occurs=9223372036854775807
        )
    )


@dataclass
class RestrictedCatalogListType:
    """
    :ivar catalog:
    """
    catalog: Optional[CatalogType] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace="",
            required=True
        )
    )

Samples Source

Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR