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>
from decimal import Decimal
from dataclasses import dataclass, field
from typing import List, Optional


@dataclass
class ColorType:
    """
    :ivar value:
    """
    value: Optional[str] = field(
        default=None,
        metadata=dict(
            type="Attribute"
        )
    )


@dataclass
class PriceType:
    """
    :ivar value:
    :ivar currency:
    """
    value: Optional[Decimal] = field(
        default=None,
    )
    currency: Optional[str] = field(
        default=None,
        metadata=dict(
            type="Attribute"
        )
    )


@dataclass
class ProductOrderType:
    """
    :ivar quantity:
    :ivar color:
    :ivar number:
    """
    quantity: Optional[int] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace="",
            required=True
        )
    )
    color: Optional[ColorType] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace=""
        )
    )
    number: Optional[int] = field(
        default=None,
        metadata=dict(
            type="Attribute"
        )
    )


@dataclass
class ProductType:
    """
    :ivar number:
    :ivar name:
    :ivar price:
    """
    number: Optional[int] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace="",
            required=True
        )
    )
    name: Optional[str] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace="",
            required=True
        )
    )
    price: Optional[PriceType] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace="",
            required=True
        )
    )


@dataclass
class ItemsType:
    """
    :ivar shirt:
    :ivar hat:
    """
    shirt: List[ProductOrderType] = field(
        default_factory=list,
        metadata=dict(
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807
        )
    )
    hat: List[ProductOrderType] = field(
        default_factory=list,
        metadata=dict(
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807
        )
    )


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


@dataclass
class OrderType:
    """
    :ivar number:
    :ivar items:
    :ivar products:
    """
    number: Optional[str] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace="",
            required=True
        )
    )
    items: Optional[ItemsType] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace="",
            required=True
        )
    )
    products: Optional[ProductsType] = field(
        default=None,
        metadata=dict(
            type="Element",
            namespace="",
            required=True
        )
    )


@dataclass
class Order(OrderType):
    class Meta:
        name = "order"

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"
                }
            }
        ]
    }
}

Samples Source

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