<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
		targetNamespace="http://castor.exolab.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 name="ship-to">
            	<xsd:complexType>
                 	<xsd:group ref="customer"/>
                </xsd:complexType>
         	</xsd:element>
        	<xsd:element ref="item" maxOccurs="unbounded" minOccurs="1"/>
        	<xsd:element ref="shipping-method"/>
        	<xsd:element ref="shipping-date"/>
      	</xsd:sequence>
      </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>
