<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" 
    targetNamespace="http://www.example.com/IPO" 
    xmlns:ipo="http://www.example.com/IPO" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- _________________________________________________ -->
<!--                                                   -->
<!-- PACKAGE: <<XSDschema>> Address  -->
<!-- _________________________________________________ -->

   <xs:annotation>
      <xs:documentation>Addresses for International Purchase order schema for Example.com. Copyright 2000 Example.com. All rights reserved.</xs:documentation>
   </xs:annotation>

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- CLASS: Address  -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

   <xs:element name="address" type="ipo:Address"/>
   <xs:complexType name="Address" abstract="true">
      <xs:annotation>
         <xs:documentation>TODO: add other Address derivations for more countries.</xs:documentation>
      </xs:annotation>
      <xs:sequence>
         <xs:element name="name" type="xs:string"/>
         <xs:element name="street" type="xs:string"/>
         <xs:element name="city" type="xs:string"/>
      </xs:sequence>
   </xs:complexType>

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- DATATYPE: <<XSDsimpleType>> Postcode  -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

   <xs:simpleType name="Postcode">
      <xs:restriction base="xs:string">
         <xs:length value="7"/>
      </xs:restriction>
   </xs:simpleType>

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- CLASS: UKAddress  -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

   <xs:element name="uKAddress" type="ipo:UKAddress" substitutionGroup="ipo:address"/>
   <xs:complexType name="UKAddress">
      <xs:complexContent>
         <xs:extension base="ipo:Address">
            <xs:sequence>
               <xs:element name="postcode" type="ipo:Postcode"/>
            </xs:sequence>
            <xs:attribute name="exportCode" type="xs:positiveInteger" fixed="1"/>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- DATATYPE: <<XSDsimpleType>> UKPostcode  -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

   <xs:simpleType name="UKPostcode">
      <xs:restriction base="ipo:Postcode">
         <xs:pattern value="[A-Z]{2}\d\s\d[A-Z]{2}"/>
      </xs:restriction>
   </xs:simpleType>

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- CLASS: USAddress  -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

   <xs:element name="uSAddress" type="ipo:USAddress" substitutionGroup="ipo:address"/>
   <xs:complexType name="USAddress">
      <xs:complexContent>
         <xs:extension base="ipo:Address">
            <xs:sequence>
               <xs:element name="state" type="ipo:USState"/>
               <xs:element name="zip" type="xs:positiveInteger"/>
            </xs:sequence>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- ENUMERATION: <<enumeration>> USState  -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

   <xs:simpleType name="USState">
      <xs:annotation>
         <xs:documentation>TODO: complete list of state codes.</xs:documentation>
      </xs:annotation>
      <xs:restriction base="xs:string">
         <xs:length value="2"/>
         <xs:enumeration value="AK"/>
         <xs:enumeration value="AL"/>
         <xs:enumeration value="AR"/>
         <xs:enumeration value="CA"/>
         <xs:enumeration value="CO"/>
         <xs:enumeration value="PA"/>
      </xs:restriction>
   </xs:simpleType>
</xs:schema>