<!--
    * Licensed to the Apache Software Foundation (ASF) under one
    * or more contributor license agreements.  See the NOTICE file
    * distributed with this work for additional information
    * regarding copyright ownership.  The ASF licenses this file
    * to you under the Apache License, Version 2.0 (the
    * "License"); you may not use this file except in compliance
    * with the License.  You may obtain a copy of the License at
    * 
    *   http://www.apache.org/licenses/LICENSE-2.0
    * 
    * Unless required by applicable law or agreed to in writing,
    * software distributed under the License is distributed on an
    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    * KIND, either express or implied.  See the License for the
    * specific language governing permissions and limitations
    * under the License.    
-->
<schema targetNamespace="http://www.example.com/IPO"
	xmlns="http://www.w3.org/2001/XMLSchema"
	xmlns:ipo="http://www.example.com/IPO">

	<annotation>
		<documentation xml:lang="en">
			International Purchase order schema for Example.com
			Copyright 2000 Example.com. All rights reserved.
		</documentation>
	</annotation>


	<element name="purchaseOrder" type="ipo:PurchaseOrderType" />

	<element name="comment" type="string" />

	<complexType name="PurchaseOrderType">
		<sequence>
			<element name="shipTo" type="ipo:Address" />
			<element name="billTo" type="ipo:Address" />
			<element ref="ipo:comment" minOccurs="0" />
			<element name="items" type="ipo:Items" />
		</sequence>
		<attribute name="orderDate" type="date" />
	</complexType>

	<complexType name="Items">
		<sequence>
			<element name="item" minOccurs="0" maxOccurs="unbounded">
				<complexType>
					<sequence>
						<element name="productName" type="string" />
						<element name="quantity">
							<simpleType>
								<restriction base="positiveInteger">
									<maxExclusive value="100" />
								</restriction>
							</simpleType>
						</element>
						<element name="USPrice" type="decimal" />
						<element ref="ipo:comment" minOccurs="0" />
						<element name="shipDate" type="date"
							minOccurs="0" />
					</sequence>
					<attribute name="partNum" type="ipo:SKU"
						use="required" />
				</complexType>
			</element>
		</sequence>
	</complexType>

	<simpleType name="SKU">
		<restriction base="string">
			<pattern value="\d{3}-[A-Z]{2}" />
		</restriction>
	</simpleType>

	<complexType name="Address">
		<sequence>
			<element name="name" type="string" />
			<element name="street" type="string" />
			<element name="city" type="string" />
		</sequence>
	</complexType>

	<complexType name="USAddress">
		<complexContent>
			<extension base="ipo:Address">
				<sequence>
					<element name="state" type="ipo:USState" />
					<element name="zip" type="positiveInteger" />
				</sequence>
			</extension>
		</complexContent>
	</complexType>

	<complexType name="UKAddress">
		<complexContent>
			<extension base="ipo:Address">
				<sequence>
					<element name="postcode" type="ipo:UKPostcode" />
				</sequence>
				<attribute name="exportCode" type="positiveInteger"
					fixed="1" />
			</extension>
		</complexContent>
	</complexType>

	<!-- other Address derivations for more countries -->

	<simpleType name="USState">
		<restriction base="string">
			<enumeration value="AK" />
			<enumeration value="AL" />
			<enumeration value="AR" />
			<enumeration value="CA" />
			<enumeration value="PA" />
			<!-- and so on ... -->
		</restriction>
	</simpleType>

	<simpleType name="Postcode">
		<restriction base="string">
			<length value="7" fixed="true" />
		</restriction>
	</simpleType>


	<simpleType name="UKPostcode">
		<restriction base="ipo:Postcode">
			<pattern value="[A-Z]{2}\d\s\d[A-Z]{2}" />
		</restriction>
	</simpleType>



</schema>

