<?xml version="1.0" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  
  <!-- Les types utiles pour les bandes dessinées -->

  <xs:simpleType name="name">
    <xs:restriction base="xs:string">
      <xs:minLength value="3" />
      <xs:maxLength value="25" />
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="titrebd">
    <xs:restriction base="xs:string">
      <xs:minLength value="5" />
      <xs:maxLength value="40" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="numerobd">
    <xs:restriction base="xs:positiveInteger">
      <xs:minInclusive value="1" />
      <xs:maxInclusive value="100" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="idstring">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="10" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="filename">
    <xs:restriction base="xs:string">
      <xs:minLength value="5" />
      <xs:maxLength value="20" />
      <xs:pattern value="\w+\.\w{3}" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="montypedate">
    <xs:restriction base="xs:string">
      <xs:pattern value="\d{4}|\d{4}-\d{2}" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="individu">
    <xs:sequence>
      <xs:element name="nom" type="name" />
      <xs:element name="prenom" type="name" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="id" type="idstring" use="required" />
  </xs:complexType>

  <xs:complexType name="refindividu">
    <xs:attribute name="ref" type="idstring"  use="required" />
  </xs:complexType>



  <!-- une bande dessinée -->

  <xs:complexType name="description_bd">
    <xs:sequence>
      
      <xs:element name="titre" type="titrebd" />
      <xs:element name="auteur" type="refindividu" minOccurs="1" maxOccurs="unbounded" />
      <xs:element name="illustrateur" type="refindividu" minOccurs="1" maxOccurs="unbounded" />
      <xs:element name="sortie" type="montypedate" />
      
      <xs:element name="resume">
	<xs:complexType mixed="true">
	  <xs:sequence>
	    <xs:element name="perso" type="name" minOccurs="0" maxOccurs="unbounded" />
	  </xs:sequence>
	</xs:complexType>
      </xs:element>
	
    </xs:sequence>

    <xs:attribute name="illustration" type="filename" use="optional" />
    
  </xs:complexType>



  <!-- une collection de bande dessinées -->
  
  <xs:element name="collection">
    <xs:complexType>
      <xs:choice  minOccurs="0" maxOccurs="unbounded">

	<xs:element name="bd" type="description_bd" />

	<xs:element name="serie">
	  <xs:complexType>
	    <xs:sequence>
	      <xs:element name="titreserie" type="titrebd" />

	      <xs:element name="bd" minOccurs="2" maxOccurs="unbounded">
		<xs:complexType>
		  <xs:complexContent>
		    <xs:extension base="description_bd">
		      <xs:attribute name="numero" type="numerobd" />
		    </xs:extension>
		  </xs:complexContent>
		</xs:complexType>
	      </xs:element>

	    </xs:sequence>
	  </xs:complexType>

	  <!-- unicité des numéros de bd dans une série -->

	  <xs:unique name="uniquenumerobd">
	    <xs:selector xpath="bd" />
	    <xs:field xpath="@numero" />
	  </xs:unique>

	</xs:element>

      </xs:choice>
    </xs:complexType>
  </xs:element>



  <!-- la bdthèque : des auteurs/illustrateurs et une collection -->

  <xs:element name="bdtheque">
    <xs:complexType>
      <xs:sequence>
	
	<xs:element name="personnes">
	  <xs:complexType>
	    <xs:sequence>
	      <xs:element name="personne" type="individu" minOccurs="1" maxOccurs="unbounded" />
	    </xs:sequence>
	  </xs:complexType>
	</xs:element>
	
	<xs:element ref="collection" />

      </xs:sequence>
    </xs:complexType>

    <!-- clefs étrangères et primaires pour les individus -->

    <xs:key name="clefpersonne">
      <xs:selector xpath="personnes/personne" />
      <xs:field xpath="@id" />
    </xs:key>
    
    <xs:keyref name="refclefpersonne" refer="clefpersonne">
      <xs:selector xpath="//auteur|//illustrateur"/>
      <xs:field xpath="@ref"/>
    </xs:keyref>

  </xs:element>



</xs:schema>



