<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="name" type="xs:string"/>
    <xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="firstname" type="xs:string" minOccurs="0"/>
                <xs:element ref="name"/>
                <xs:element name="instrument" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="gender" default="female">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="male"/>
                        <xs:enumeration value="female"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="tracklist">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="track" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="name"/>
                            <xs:element name="track_refs">
                                <xs:complexType>
                                    <xs:attribute name="album_ref" type="idType"/>
                                    <xs:attribute name="interpret_ref" type="idType"/>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="length" type="xs:duration"/>
                            <xs:element name="review" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType mixed="true">
                                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                                        <xs:element name="link">
                                            <xs:complexType>
                                                <xs:simpleContent>
                                                    <xs:extension base="xs:string">
                                                        <xs:attribute name="ref" type="idType"/>
                                                    </xs:extension>
                                                </xs:simpleContent>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:choice>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="id" type="idType" use="required"/>
                        <xs:attribute name="style" default="Rock">
                            <xs:simpleType>
                                <xs:restriction base="xs:NMTOKEN">
                                    <xs:enumeration value="Ragga"/>
                                    <xs:enumeration value="Dub"/>
                                    <xs:enumeration value="Rock"/>
                                    <xs:enumeration value="Funk"/>
                                    <xs:enumeration value="Dancehall"/>
                                    <xs:enumeration value="Triphop"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
                <xs:element name="interpret" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:choice>
                            <xs:element name="band">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element ref="name"/>
                                        <xs:element ref="person" maxOccurs="unbounded"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="soloartist">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element ref="person"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:choice>
                        <xs:attribute name="id" type="idType" use="required"/>
                    </xs:complexType>
                </xs:element>
                <xs:element name="company" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="name"/>
                            <xs:element name="adresse" minOccurs="0">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="street" type="xs:string"/>
                                        <xs:element name="town" type="xs:string"/>
                                        <xs:element name="country">
                                            <xs:simpleType>
                                                <xs:restriction base="xs:token">
                                                    <xs:minLength value="1"/>
                                                    <xs:maxLength value="3"/>
                                                </xs:restriction>
                                            </xs:simpleType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="id" type="idType" use="required"/>
                    </xs:complexType>
                </xs:element>
                <xs:element name="album" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="name"/>
                            <xs:element name="year" type="xs:gYear"/>
                        </xs:sequence>
                        <xs:attribute name="id" type="idType" use="required"/>
                        <xs:attribute name="company_ref" type="idType"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
        <xs:keyref name="albumCompany" refer="companyKey">
            <xs:selector xpath="album"/>
            <xs:field xpath="@company_ref"/>
        </xs:keyref>
        <xs:key name="companyKey">
            <xs:selector xpath="company"/>
            <xs:field xpath="@id"/>
        </xs:key>
        <xs:key name="albumKey">
            <xs:selector xpath="album"/>
            <xs:field xpath="@id"/>
        </xs:key>
        <xs:key name="interpretKey">
            <xs:selector xpath="interpret"/>
            <xs:field xpath="@id"/>
        </xs:key>
        <xs:key name="trackKey">
            <xs:selector xpath="track"/>
            <xs:field xpath="@id"/>
        </xs:key>
        <xs:keyref name="trackAlbum" refer="albumKey">
            <xs:selector xpath="track/track_refs"/>
            <xs:field xpath="@album_ref"/>
        </xs:keyref>
        <xs:keyref name="trackInterpret" refer="interpretKey">
            <xs:selector xpath="track/track_refs"/>
            <xs:field xpath="@interpret_ref"/>
        </xs:keyref>
        <xs:key name="albumTrackKey">
            <xs:selector xpath="album | track"/>
            <xs:field xpath="@id"/>
        </xs:key>
        <xs:keyref name="linkRef" refer="albumTrackKey">
            <xs:selector xpath=".//link"/>
            <xs:field xpath="@ref"/>
        </xs:keyref>
    </xs:element>
    <xs:simpleType name="idType">
        <xs:restriction base="xs:NCName"/>
    </xs:simpleType>
</xs:schema>

