<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- NOTE: these definitions are in "top-down" order. -->

<xs:element name="products_by_vendor">
  <xs:complexType>
    <xs:sequence>
        <xs:element ref="vendor" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:key name="PK">
    <xs:selector xpath="product"/>
    <xs:field xpath="gg_sku"/>
  </xs:key>
</xs:element>

<xs:element name="vendor">
  <xs:complexType>
    <xs:sequence>
     <xs:element name="vendor_name" type="xs:string" />

     <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="phone"   type="xs:string"/>
      <xs:element name="fax"     type="xs:string"/>
      <xs:element name="website" type="xs:anyURI"/>
      <xs:element name="address" type="AddressType"/>
      <xs:element name="email"   type="xs:string"/>
     </xs:choice>

     <xs:element ref="suite"   minOccurs="0" maxOccurs="unbounded" />
     <xs:element ref="product" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="id" type="xs:ID" use="required" />
  </xs:complexType>
</xs:element>

<xs:element name="suite">
  <xs:complexType>
    <xs:sequence>
	 <xs:group   ref="skuData" />
     <xs:element ref="product"   minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="product">
  <xs:complexType>
    <xs:sequence>
     <xs:element name="gg_sku" type="GG_SKU" />
	 <xs:group   ref="skuData" />
     <xs:element ref="version"   minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="version">
  <xs:complexType>
    <xs:sequence>
	 <xs:group  ref="skuData" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

<!-- GROUP definitions -->

<xs:group name="skuData">
   <xs:sequence>
     <xs:element name="vendor_sku" type="xs:string" minOccurs="0" maxOccurs="1" />
     <xs:element name="short_desc" type="xs:string" />
     <xs:element name="long_desc"  type="xs:string" minOccurs="0" maxOccurs="1" />
     <xs:element ref="price"     minOccurs="0" maxOccurs="unbounded" />
     <xs:element ref="inventory" minOccurs="0" maxOccurs="unbounded" />
   </xs:sequence>
</xs:group>

<!-- "primitive" definitions that are referenced above -->

<xs:element name="price">
  <xs:complexType>
    <xs:simpleContent>
	<xs:extension base="MoneyType">
      <xs:attribute name="type" type="PriceType" default="retail" />
	</xs:extension>
	</xs:simpleContent>
  </xs:complexType>
</xs:element>

<xs:element name="inventory">
  <xs:complexType>
    <xs:simpleContent>
	<xs:extension base="xs:integer">
      <xs:attribute name="location" type="LocationType" default="showroom" />
	</xs:extension>
	</xs:simpleContent>
  </xs:complexType>
</xs:element>

<xs:simpleType name="PriceType">
 <xs:restriction base="xs:NMTOKEN">
     <xs:enumeration value="cost"/>
     <xs:enumeration value="sale"/>
     <xs:enumeration value="retail"/>
 </xs:restriction>
</xs:simpleType>

<xs:simpleType name="LocationType">
 <xs:restriction base="xs:NMTOKEN">
     <xs:enumeration value="warehouse"/>
     <xs:enumeration value="showroom"/>
 </xs:restriction>
</xs:simpleType>

<xs:simpleType name="GG_SKU">
   <xs:restriction base="xs:string">
     <xs:pattern value="GG\d{3}"/>
   </xs:restriction>
</xs:simpleType>

<xs:complexType name="AddressType">
   <xs:attribute name="state"  type="xs:string"/>
   <xs:attribute name="city"   type="xs:string"/>
   <xs:attribute name="zip"    type="xs:decimal"/>
   <xs:attribute name="street" type="xs:string"/>
</xs:complexType>

<xs:simpleType name="MoneyType">
    <xs:restriction base="xs:string">
        <xs:pattern value="\p{Sc}?\p{Nd}+(\.\p{Nd}\p{Nd})?"/>
    </xs:restriction>
</xs:simpleType>

</xs:schema>