<?xml version="1.0"?>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 	targetNamespace="http://www.clemson.edu/cu-gn/1.0/"
 	xmlns="http://www.clemson.edu/cu-gn/1.0/"
 	elementFormDefaul="qualified">
 
 <!-- 
   This is a super-simplistic schema for XML content returned by geonames.org search web services.
  -->
 	<xs:simpleType name="emptystring">
 		<xs:restriction base="xs:string">
 			<xs:enumeration value="" />
 		</xs:restriction>
 	</xs:simpleType>
	 

	<xs:simpleType name="decimalOrEmpty">
		<xs:union memberTypes="xs:decimal emptystring" />
	</xs:simpleType>
	<xs:simpleType name="integerOrEmpty">
		<xs:union memberTypes="xs:integer emptystring" />
	</xs:simpleType>
	
	 <xs:element name="totalResultsCount" type="xs:integer" />
	 <xs:element name="toponymName" type="xs:string" />
	 <xs:element name="name" type="xs:string" />
	 <xs:element name="lat" type="xs:decimal" />
	 <xs:element name="lng" type="xs:decimal" />
	 <xs:element name="geonameId" type="xs:integer" />
	 <xs:element name="countryCode" type="xs:string" />
	 <xs:element name="countryName" type="xs:string" />
	 <xs:element name="fcl" type="xs:string" />
	 <xs:element name="fcode" type="xs:string" />
	 <xs:element name="fclName" type="xs:string" />
	 <xs:element name="fcodeName" type="xs:string" />
	 <xs:element name="population" type="integerOrEmpty" />
	 <xs:element name="alternateNames" type="xs:string" />
	 <xs:element name="elevation" type="decimalOrEmpty" />
	 <xs:element name="continentCode" type="xs:string" />
	 <!--  not obvious that cc2 is "continent code 2" -->
	 <xs:element name="cc2" type="xs:string" />
	 <xs:element name="adminCode1" >
	 	<xs:complexType>
	 		<xs:simpleContent>
	 			<xs:extension base="xs:string">
	 				<xs:attribute name="ISO3166-2" type="xs:string" use="optional" />
	 			</xs:extension>
	 		</xs:simpleContent>
	 	</xs:complexType>
	 </xs:element>
	 <xs:element name="adminName1" type="xs:string" />
	 <xs:element name="adminCode2" type="xs:string" />
	 <xs:element name="adminName2" type="xs:string" />
	 <xs:element name="adminCode3" type="xs:string" />
	 <xs:element name="adminName3" type="xs:string" />
	 <xs:element name="alternateName">
	 	<xs:complexType>
	 		<xs:simpleContent>
	 			<xs:extension base="xs:string">
	 				<xs:attribute name="lang" type="xs:string" use="optional" />
	 			</xs:extension>
	 		</xs:simpleContent>
	 	</xs:complexType>
	 </xs:element>
	 <xs:element name="timezone">
	 	<xs:complexType>
	 		<xs:simpleContent>
	 			<xs:extension base="xs:string">
	 				<xs:attribute name="dstOffset" type="xs:decimal" />
	 				<xs:attribute name="gmtOffset" type="xs:decimal" />
	 			</xs:extension>
	 		</xs:simpleContent>
	 	</xs:complexType>
	 </xs:element>
	 
	<xs:element name="west" type="xs:decimal" />
	<xs:element name="north" type="xs:decimal" />
	<xs:element name="east" type="xs:decimal" />
	<xs:element name="south" type="xs:decimal" />
	 <xs:element name="bbox">
	 	<xs:complexType>
	 		<xs:all>
	 			<xs:element ref="west"  />
				 <xs:element ref="north"  />
				 <xs:element ref="east"  />
				 <xs:element ref="south"  />
	 		</xs:all>
	 	</xs:complexType>
	 </xs:element>
	 <xs:element name="score" type="xs:decimal" />

	 <!-- containment -->
	 <xs:element name="geoname">
	 	<xs:complexType>
	 		<xs:choice minOccurs="0" maxOccurs="unbounded">
	 			<xs:element ref="toponymName" />
				 <xs:element ref="name" />
				 <xs:element ref="lat" />
				 <xs:element ref="lng" />
				 <xs:element ref="geonameId" />
				 <xs:element ref="countryCode" />
				 <xs:element ref="countryName" />
				 <xs:element ref="fcl"  />
				 <xs:element ref="fcode" />
				 <xs:element ref="fclName"  />
				 <xs:element ref="fcodeName" />
				 <xs:element ref="population"/>
				 <xs:element ref="alternateNames" />
				 <xs:element ref="elevation"  />
				 <xs:element ref="cc2"  />
				 <xs:element ref="continentCode"  />
				 <xs:element ref="adminCode1"  />
				 <xs:element ref="adminName1" />
				 <xs:element ref="adminCode2"  />
				 <xs:element ref="adminName2"  />
				 <xs:element ref="adminCode3"/>
				 <xs:element ref="adminName3" />
				 <xs:element ref="alternateName"/>
				 <xs:element ref="timezone"/>
				 <xs:element ref="bbox"/>
				 <xs:element ref="score"/>
	 		</xs:choice>
	 	</xs:complexType>
	 </xs:element>	 

	<!-- I do a type here so that I can extended it below with an attribute such that the namespace is not
		   required when using the attribute on elements
	 -->	 
	 <xs:complexType name="geonamesBaseType">
	 		<xs:choice minOccurs="0" maxOccurs="unbounded">
	 			<xs:element ref="totalResultsCount" />
	 			<xs:element ref="geoname" />
	 		</xs:choice>
	 </xs:complexType>
	 
	 <xs:element name="geonames">
	 	<xs:complexType>
	 		<xs:complexContent>
	 			<xs:extension base="geonamesBaseType">
	 				<xs:attribute name="style">
				 		<xs:simpleType>
					 		<xs:restriction base="xs:string">
					 			<xs:enumeration value="SHORT" />
					 			<xs:enumeration value="MEDIUM" />
					 			<xs:enumeration value="LONG" />
					 			<xs:enumeration value="FULL" />
					 		</xs:restriction>
					 	</xs:simpleType>
	 				</xs:attribute>
	 			</xs:extension>
	 		</xs:complexContent>
	 	</xs:complexType>
	 </xs:element>
 </xs:schema>
 