<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:element name="orderSlip">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="customerList"/>
        <xsd:element ref="productList"/>
        <xsd:element ref="orderList"/>
      </xsd:sequence>
      <xsd:attribute name="number" type="xsd:integer" use="required"/>
    </xsd:complexType>

    <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:element name="customerList">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="personalCustomer"/>
        <xsd:element ref="corporateCustomer"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>

  <xsd:group name="Customer.conts">
    <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:group>
  <xsd:attributeGroup name="Customer.attrs">
    <xsd:attribute name="id" type="xsd:NCName" use="required"/>
  </xsd:attributeGroup>

  <xsd:element name="personalCustomer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:group ref="Customer.conts"/>
        <xsd:element name="birthday" type="xsd:date"/>
      </xsd:sequence>
      <xsd:attributeGroup ref="Customer.attrs"/>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="corporateCustomer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:group ref="Customer.conts"/>
        <xsd:element name="charge" type="xsd:string"/>
      </xsd:sequence>
      <xsd:attributeGroup ref="Customer.attrs"/>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="productList">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="product" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="product">
    <xsd:complexType>
      <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:element>

  <xsd:element name="orderList">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="order" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="order">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="customerRef"/>
        <xsd:element name="date" type="xsd:date"/>
        <xsd:element name="time" type="xsd:time"/>
        <xsd:element ref="orderLineItemList"/>
      </xsd:sequence>
      <xsd:attribute name="number" type="xsd:integer" use="required"/>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="customerRef">
    <xsd:complexType>
      <xsd:attribute name="ref" type="xsd:NCName" use="required"/>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="orderLineItemList">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="orderLineItem" minOccurs="1" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="orderLineItem">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="productRef"/>
        <xsd:element name="quantity" type="xsd:decimal"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="productRef">
    <xsd:complexType>
      <xsd:attribute name="ref" type="xsd:NCName" use="required"/>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

