<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://castor.org/Test/Invoice">

   <xsd:annotation>
      <xsd:documentation>
         This is a test XML Schema for Castor XML.
      </xsd:documentation>
   </xsd:annotation>

   <!--
       A simple representation of an invoice. This is simply an example
       and not meant to be an exact or even complete representation of an invoice.
     -->
   <xsd:element name="invoice">
      <xsd:annotation>
         <xsd:documentation>
            A simple representation of an invoice
         </xsd:documentation>
      </xsd:annotation>

      <xsd:complexType>
         <xsd:sequence>
            <xsd:element ref="ship-to"/>
            <xsd:element ref="item" maxOccurs="unbounded" minOccurs="1"/>
            <xsd:element ref="shipping-method"/>
            <xsd:element ref="shipping-date"/>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>

   <xsd:element name="ship-to">
      <xsd:complexType>
         <xsd:group ref="customer"/>
      </xsd:complexType>
   </xsd:element>

   <!-- Description of a customer -->
   <xsd:group name="customer">
      <xsd:sequence>
         <xsd:element name="name"    type="xsd:string"/>
         <xsd:element name="address" type="address"/>
         <xsd:element name="phone"   type="TelephoneNumberType"/>
      </xsd:sequence>
   </xsd:group>

   <!-- Description of an item -->
   <xsd:element name="item">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="Quantity" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="Price"    type="PriceType"   minOccurs="1" maxOccurs="1"/>
         </xsd:sequence>
         <xsd:attributeGroup ref="ItemAttributes"/>
      </xsd:complexType>
   </xsd:element>

   <!-- Shipping Method -->
   <xsd:element name="shipping-method">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="carrier" type="xsd:string"/>
            <xsd:element name="option"  type="xsd:string"/>
            <xsd:element name="estimated-delivery" type="xsd:duration"/>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>

   <!-- Shipping date -->
   <xsd:element name="shipping-date">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="date" type="xsd:date"/>
            <xsd:element name="time" type="xsd:time"/>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>

   <!-- A simple U.S. based Address structure -->
   <xsd:complexType name="address">
      <xsd:annotation>
         <xsd:documentation>
            Represents a U.S. Address
         </xsd:documentation>
      </xsd:annotation>

      <xsd:sequence>
         <!-- street address 1 -->
         <xsd:element name="street1" type="xsd:string"/>
         <!-- optional street address 2 -->
         <xsd:element name="street2" type="xsd:string" minOccurs="0"/>
         <!-- city-->
         <xsd:element name="city" type="xsd:string"/>
         <!-- state code -->
         <xsd:element name="state" type="stateCodeType"/>
         <!-- zip-code -->
         <xsd:element ref="zip-code"/>
      </xsd:sequence>
   </xsd:complexType>

   <!-- A U.S. Zip Code -->
   <xsd:element name="zip-code">
      <xsd:simpleType>
         <xsd:restriction base="xsd:string">
            <xsd:pattern value="[0-9]{5}(-[0-9]{4})?"/>
         </xsd:restriction>
      </xsd:simpleType>
   </xsd:element>

   <!-- State Code
        obviously not a valid state code....but this is just
        an example and I don't feel like creating all the valid
        ones.
    -->
   <xsd:simpleType name="stateCodeType">
      <xsd:restriction base="xsd:string">
         <xsd:pattern value="[A-Z]{2}"/>
      </xsd:restriction>
   </xsd:simpleType>

   <!-- Telephone Number -->
   <xsd:simpleType name="TelephoneNumberType">
      <xsd:restriction base="xsd:string">
         <xsd:length value="12"/>
         <xsd:pattern value="[0-9]{3}-[0-9]{3}-[0-9]{4}"/>
      </xsd:restriction>
   </xsd:simpleType>

   <!-- Cool price type -->
   <xsd:simpleType name="PriceType">
      <xsd:restriction base="xsd:decimal">
         <xsd:fractionDigits value="2"/>
         <xsd:totalDigits value="5"/>
         <xsd:minInclusive value="1"/>
         <xsd:maxInclusive value="100"/>
      </xsd:restriction>
   </xsd:simpleType>

   <!-- The attributes for an Item -->
   <xsd:attributeGroup name="ItemAttributes">
      <xsd:attribute name="Id"       type="xsd:ID"      use="required"/>
      <xsd:attribute name="InStock"  type="xsd:boolean" default="false"/>
      <xsd:attribute name="Category" type="xsd:string"  use="required"/>
   </xsd:attributeGroup>

</xsd:schema>
