<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="Shop">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="CD" type="CDs" minOccurs="0" maxOccurs="unbounded">
					<xs:key name="CDKey">
						<xs:selector xpath="CD"/>
						<xs:field xpath="@ProdID"/>
					</xs:key>
					<xs:keyref name="CompRef1" refer="CompKey">
						<xs:selector xpath="CD"/>
						<xs:field xpath="Distributor"/>
					</xs:keyref>
					<xs:keyref name="SoloartistRef" refer="PersonKey">
						<xs:selector xpath="CD"/>
						<xs:field xpath="Soloartist"/>
					</xs:keyref>
				</xs:element>
				<xs:element name="DVD" type="DVDs" minOccurs="0" maxOccurs="unbounded">
					<xs:key name="DVDKey">
						<xs:selector xpath="DVD"/>
						<xs:field xpath="@ProdID"/>
					</xs:key>
					<xs:keyref name="CompRef2" refer="CompKey">
						<xs:selector xpath="DVD"/>
						<xs:field xpath="Distributor"/>
					</xs:keyref>
					<xs:keyref name="ActorRef" refer="PersonKey">
						<xs:selector xpath="DVD"/>
						<xs:field xpath="Actor"/>
					</xs:keyref>
					<xs:keyref name="DirectorRef" refer="PersonKey">
						<xs:selector xpath="DVD"/>
						<xs:field xpath="Director"/>
					</xs:keyref>
				</xs:element>
				<xs:element name="Person" type="Persons" minOccurs="0" maxOccurs="unbounded">
					<xs:key name="PersonKey">
						<xs:selector xpath="Person"/>
						<xs:field xpath="@PersID"/>
					</xs:key>
					<xs:keyref name="AlbumsRef" refer="CDKey">
						<xs:selector xpath="Person"/>
						<xs:field xpath="Albums"/>
					</xs:keyref>
					<xs:keyref name="FilmsRef" refer="DVDKey">
						<xs:selector xpath="DVD"/>
						<xs:field xpath="Films"/>
					</xs:keyref>
				</xs:element>
				<xs:element name="Company" type="Companies" minOccurs="0" maxOccurs="unbounded">
					<xs:key name="CompKey">
						<xs:selector xpath="Company"/>
						<xs:field xpath="@CompID"/>
					</xs:key>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="Products" abstract="true">
		<xs:sequence>
			<xs:element name="Titel" type="xs:string"/>
			<xs:element name="Year">
				<xs:simpleType>
					<xs:restriction base="xs:positiveInteger">
						<xs:minExclusive value="1950"/>
						<xs:maxExclusive value="2050"/>
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
			<xs:element name="Price">
				<xs:simpleType>
					<xs:restriction base="xs:decimal">
						<xs:totalDigits value="6"/>
						<xs:fractionDigits value="2"/>
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="ProdID" type="xs:ID" use="required"/>
	</xs:complexType>
	<xs:complexType name="CDs">
		<xs:complexContent>
			<xs:extension base="Products">
				<xs:sequence>
					<xs:element name="Genre" type="MusicGenres" default="None"/>
					<xs:choice>
						<xs:element name="Band">
							<xs:complexType>
								<xs:sequence>
									<xs:element name="Name" type="xs:string"/>
									<xs:element name="Person" type="xs:IDREF" maxOccurs="unbounded"/>
								</xs:sequence>
							</xs:complexType>
						</xs:element>
						<xs:element name="Soloartist" type="xs:IDREF"/>
					</xs:choice>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="DVDs">
		<xs:complexContent>
			<xs:extension base="Products">
				<xs:sequence>
					<xs:element name="Genre" type="FilmGenres" default="None"/>
					<xs:element name="RegionCode" default="2">
						<xs:simpleType>
							<xs:restriction base="xs:positiveInteger">
								<xs:minInclusive value="1"/>
								<xs:maxInclusive value="6"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:element>
					<xs:element name="Actor" type="xs:IDREF" maxOccurs="unbounded"/>
					<xs:element name="Director" type="xs:IDREF"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Companies">
		<xs:sequence>
			<xs:element name="Name" type="xs:string"/>
			<xs:choice>
				<xs:element name="Address" type="generalAddresses"/>
				<xs:element name="USAddress" type="USAddresses"/>
				<xs:element name="UKAddress" type="UKAddresses"/>
			</xs:choice>
		</xs:sequence>
		<xs:attribute name="CompID" type="xs:ID"/>
	</xs:complexType>
	<xs:complexType name="Addresses" abstract="true">
		<xs:sequence>
			<xs:element name="Street" type="xs:string"/>
			<xs:element name="City" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="USAddresses">
		<xs:complexContent>
			<xs:extension base="Addresses">
				<xs:sequence>
					<xs:element name="State" type="xs:string"/>
					<xs:element name="Zip">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:pattern value="[0-9]{5}(-[0-9]{4})?"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:element>
				</xs:sequence>
				<xs:attribute name="country" type="xs:NMTOKEN" fixed="US"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="UKAddresses">
		<xs:complexContent>
			<xs:extension base="Addresses">
				<xs:sequence>
					<xs:element name="Postcode">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:pattern value="[A-Z]{1,2}[1-9]{1,2} [1-9][A-Z]{2}"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:element>
				</xs:sequence>
				<xs:attribute name="country" type="xs:NMTOKEN" fixed="UK"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="generalAddresses">
		<xs:complexContent>
			<xs:extension base="Addresses">
				<xs:sequence>
					<xs:element name="Zip" type="xs:string"/>
				</xs:sequence>
				<xs:attribute name="country" type="xs:NMTOKEN"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:simpleType name="MusicGenres">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="None"/>
			<xs:enumeration value="Classic"/>
			<xs:enumeration value="Country"/>
			<xs:enumeration value="Funk"/>
			<xs:enumeration value="HipHop"/>
			<xs:enumeration value="House"/>
			<xs:enumeration value="Pop"/>
			<xs:enumeration value="Punk"/>
			<xs:enumeration value="Rock"/>
			<xs:enumeration value="Soul"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="FilmGenres">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="None"/>
			<xs:enumeration value="Art"/>
			<xs:enumeration value="Action"/>
			<xs:enumeration value="Drama"/>
			<xs:enumeration value="Documentation"/>
			<xs:enumeration value="Historie"/>
			<xs:enumeration value="Horror"/>
			<xs:enumeration value="Kommödie"/>
			<xs:enumeration value="Lovestory"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="Persons">
		<xs:sequence>
			<xs:element name="Surname" minOccurs="0"/>
			<xs:element name="Name"/>
			<xs:element name="Albums" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
			<xs:element name="Films" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
		<xs:attribute name="PersID" type="xs:ID" use="required"/>
	</xs:complexType>
</xs:schema>

