<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:element name="orderSlip" type="OrderSlip">
    <xsd:key name="customer.key">
      <xsd:selector xpath="customerList/*"/>
      <xsd:field xpath="@id"/>
    </xsd:key>
    <xsd:keyref name="customer.ref" refer="customer.key">
      <xsd:selector xpath=".//customerRef"/>
      <xsd:field xpath="@ref"/>
    </xsd:keyref>
    <xsd:key name="product.key">
      <xsd:selector xpath="productList/product"/>
      <xsd:field xpath="@id"/>
    </xsd:key>
    <xsd:keyref name="product.ref" refer="product.key">
      <xsd:selector xpath=".//productRef"/>
      <xsd:field xpath="@ref"/>
    </xsd:keyref>
    <xsd:unique name="order.number">
      <xsd:selector xpath="orderList/order"/>
      <xsd:field xpath="@number"/>
    </xsd:unique>
  </xsd:element>

  <xsd:complexType name="OrderSlip">
    <xsd:sequence>
      <xsd:element name="customerList" type="CustomerList"/>
      <xsd:element name="productList"  type="ProductList"/>
      <xsd:element name="orderList"    type="OrderList"/>
    </xsd:sequence>
    <xsd:attribute name="number" type="xsd:integer" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="CustomerList">
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="personalCustomer"  type="PersonalCustomer"/>
      <xsd:element name="corporateCustomer" type="CorporateCustomer"/>
    </xsd:choice>
  </xsd:complexType>

  <xsd:complexType name="Customer">
    <xsd:sequence>
      <xsd:element name="name"    type="xsd:string"/>
      <xsd:element name="address" type="xsd:string"/>
      <xsd:element name="phone">
        <xsd:simpleType>
          <xsd:restriction base="xsd:string">
            <xsd:pattern value="[0-9]+(\-[0-9X]+)*"/>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:NCName" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="PersonalCustomer">
    <xsd:complexContent>
      <xsd:extension base="Customer">
        <xsd:sequence>
          <xsd:element name="birthday" type="xsd:date"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="CorporateCustomer">
    <xsd:complexContent>
      <xsd:extension base="Customer">
        <xsd:sequence>
          <xsd:element name="charge" type="xsd:string"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="ProductList">
    <xsd:sequence>
      <xsd:element name="product" type="Product"
          minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="Product">
    <xsd:sequence>
      <xsd:element name="name"  type="xsd:string"/>
      <xsd:element name="price" type="xsd:decimal"/>
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:NCName" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="OrderList">
    <xsd:sequence>
      <xsd:element name="order" type="Order"
          minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="Order">
    <xsd:sequence>
      <xsd:element name="customerRef" type="CustomerRef"/>
      <xsd:element name="date" type="xsd:date"/>
      <xsd:element name="time" type="xsd:time"/>
      <xsd:element name="orderLineItemList" type="OrderLineItemList"/>
    </xsd:sequence>
    <xsd:attribute name="number" type="xsd:integer" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="CustomerRef">
    <xsd:attribute name="ref" type="xsd:NCName" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="OrderLineItemList">
    <xsd:sequence>
      <xsd:element name="orderLineItem" type="OrderLineItem"
          minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="OrderLineItem">
    <xsd:sequence>
      <xsd:element name="productRef" type="ProductRef"/>
      <xsd:element name="quantity"   type="xsd:decimal"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="ProductRef">
    <xsd:attribute name="ref" type="xsd:NCName" use="required"/>
  </xsd:complexType>

</xsd:schema>

