<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- XML und Datenbanken  -  4. Uebung  -  Musterloesung: XML Schema fuer CD- und Komponistendatenbank -->

<!-- Elementtypen -->

<xs:complexType name="KomponistenType">
 <xs:sequence>
  <xs:element name="komponist" type="KomponistType" minOccurs="0" maxOccurs="unbounded"/>
 </xs:sequence>
</xs:complexType>

<xs:complexType name="KomponistType">
 <xs:sequence>
  <xs:element name="stueck" type="StueckType" minOccurs="0" maxOccurs="unbounded"/>
 </xs:sequence>
 <xs:attribute name="K_ID" use="required" type="xs:unsignedInt"/>
 <xs:attribute name="vorname" type="xs:token"/>
 <xs:attribute name="nachname" use="required" type="xs:token"/>
 <xs:attribute name="geburtsjahr" type="xs:gYear"/>
 <xs:attribute name="todesjahr" type="xs:gYear"/>
</xs:complexType>
<xs:complexType name="StueckType">
 <xs:sequence>
  <xs:element name="aufnahme" type="AufnahmeType" minOccurs="0" maxOccurs="unbounded"/>
 </xs:sequence>
 <xs:attribute name="stueck_ID" use="required" type="xs:unsignedInt"/>
 <xs:attribute name="titel" use="required" type="xs:token"/>
 <xs:attribute name="tonart" type="xs:NCName"/>
 <xs:attribute name="opus" type="xs:token"/>
</xs:complexType>
<xs:complexType name="AufnahmeType">
 <xs:attribute name="aufn_ID" use="required" type="xs:unsignedInt"/>
 <xs:attribute name="orchester" use="required" type="xs:token"/>
 <xs:attribute name="dirigent" type="xs:token"/>
</xs:complexType>

<xs:complexType name="CDsType">
 <xs:sequence>
  <xs:element name="cd" type="CDType" minOccurs="0" maxOccurs="unbounded"/>
 </xs:sequence>
</xs:complexType>

<xs:complexType name="CDType">
 <xs:sequence>
  <xs:element name="CDAufnahme" type="CDAufnahmeType" minOccurs="1" maxOccurs="unbounded"/>
 </xs:sequence>
 <xs:attribute name="titel" use="required" type="xs:token"/>
 <xs:attribute name="preis" type="PreisType"/>
 <xs:attribute name="gesamtspielzeit" use="required" type="SpielzeitType"/>
</xs:complexType>
<xs:complexType name="CDAufnahmeType">
 <xs:attribute name="aufn_ID" use="required" type="xs:unsignedInt"/>
</xs:complexType>

<xs:complexType name="CDDBType">
<xs:sequence>
<xs:element name="komponisten" type="KomponistenType"/>
<xs:element name="cds" type="CDsType"/>
</xs:sequence>
</xs:complexType>

<!-- einziges global deklariertes Element -> Wurzelelement der CD-Datenbank -->
<xs:element name="CDDB" type="CDDBType">
<!-- Schluessel und Unique-Constraints werden innerhalb des Elements deklariert -->
<!-- Primärschlüssel -->
<xs:key name="PK_Komponist">
<xs:selector xpath="komponisten/*"/>
<xs:field xpath="@K_ID"/>
</xs:key>
<xs:key name="PK_Stueck">
<xs:selector xpath="komponisten/komponist/*"/>
<xs:field xpath="@stueck_ID"/>
</xs:key>
<xs:key name="PK_CD">
<xs:selector xpath="cds/*"/>
<xs:field xpath="@titel"/>
</xs:key>
<xs:key name="PK_Aufnahme">
<xs:selector xpath="komponisten/komponist/stueck/*"/>
<xs:field xpath="@aufn_ID"/>
</xs:key>

<!-- mögliche Unique-Constraints -->
<xs:unique name="unique_opus">
<xs:selector xpath="komponisten/komponist/stueck"/>
<xs:field xpath="@opus"/>
</xs:unique>

<!-- Fremdschlüssel -->
<xs:keyref name="FK_CD_Aufnahme" refer="PK_Aufnahme">
<xs:selector xpath="cds/cd/*"/>
<xs:field xpath="@aufn_ID"/>
</xs:keyref>
</xs:element>
<!-- Ende der Deklaration des Wurzelelements -->

<!-- Datentypen -->
<xs:simpleType name="PreisType">
<xs:restriction base="xs:decimal">
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SpielzeitType">
<xs:restriction base="xs:duration">
<xs:pattern value="PT\d+M[0-5]\dS"/>
</xs:restriction>
</xs:simpleType>

</xs:schema>

