XML Schema

 

Recommandation du W3C : Mai 2001

Un langage pour définir la structure et le typage des documents

Une syntaxe XML


XML/XML Schema    17/9/2002

1/20


 
 
 
 
 

Type complexe

 

Déclaration d'un élément book :


<xsd:schema xmls:xsd="http://www.w3.org/2001/XMLSchema"
	xmls:s='http://www.inria.fr/acacia'>

	<xsd:element name="book" type="s:bookType"/>

<!-- Déclaration de son type bookType-->


	<xsd:complexType name='bookType'>
    		<xsd:sequence>
			<xsd:element name='author' 	type='s:author'/>
			<xsd:element name='title'	type='string'/>
			<xsd:element name='publisher' 	type='string'/>
			<xsd:element name='year' 	type='integer'/> 
    		</xsd:sequence>

    		<xsd:attribute name='id'		type='string'/>
	</xsd:complexType>
<xsd:schema>

Elément book dans un document


<s:book id='...'>
	<s:author>
		<s:name>J. M. Keynes</s:name>
	</s:author>
	<s:title>General Theory ...</s:title>
	<s:publisher>...</s:publisher>
	<s:year>...</s:year> 
<s:book>


XML/XML Schema    17/9/2002

2/20


 
 
 
 
 

Type complexe avec choix

 


<xsd:complexType name='bookType'>
    <xsd:sequence>
	<xsd:element name='author' 	type='s:author'/>
	<xsd:element name='title'	type='string'/>
	<xsd:element name='publisher' 	type='string'/>

	<xsd:choice>
		<xsd:element name='year' 	type='gYear'/>
		<xsd:element name='date' 	type='date'/> 
	</xsd:choice>

    </xsd:sequence>

    <xsd:attribute name='id'		type='string'/>
</xsd:complexType>	

XML/XML Schema    17/9/2002

3/20


 
 
 
 
 

Déclaration sans ordre

 

Tous les éléments doivent apparaitre zéro ou une fois, dans n'importe quel ordre


<xsd:complexType name="bookType">
   <xsd:all>
	<xsd:element name='author' 	type='s:author'/>
	<xsd:element name='title'	type='string'/>
	<xsd:element name='publisher' 	type='string'/>
	<xsd:element name='year' 	type='gYear'/> 
   </xsd:all>
   <xsd:attribute name='id'		type='string'/>
 </xsd:complexType>

XML/XML Schema    17/9/2002

4/20


 
 
 
 
 

Facettes d'occurrence

 

Pour un élément


<xsd:element name="date" type="integer"
	minOccurs="0" maxOccurs="1" 
	fixed="2000" default="2000"/>

Pour un attribut


<xsd:attribute name="price" type="integer"
	use="required | optional | fixed | default"
	value="123"/>

XML/XML Schema    17/9/2002

5/20


 
 
 
 
 

Types simples

 

  • string

  • integer

  • decimal

  • float

  • boolean

  • time : 13:20:00.000

  • timeInstant : 1999-05-31T13:20:00.000-05:00

  • date

  • Name

  • QName

  • ID IDREF

  • NMTOKEN

  • ENTITY

  • ...


XML/XML Schema    17/9/2002

6/20


 
 
 
 
 

Type simple étendu

 

Spécification d'un motif à l'aide d'expression régulière

Date sous la forme : 16-10-1959


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

Code sous la forme : Catch-22


<xsd:simpleType name="code">
   <xsd:restriction base="xsd:string">
	<xsd:pattern value="[A-Za-z]{5}-\d{2}"/>
   </xsd:restriction>
</xsd:simpleType>

XML/XML Schema    17/9/2002

7/20


 
 
 
 
 

Type énuméré

 


<xsd:simpleType name="Region">
   <xsd:restriction base="xsd:string">
     <xsd:enumeration value="Alsace"/>
     <xsd:enumeration value="Centre"/>
     <xsd:enumeration value="Languedoc-Roussillon"/>
     <xsd:enumeration value="PACA"/>
     <!-- etc ... -->
   </xsd:restriction>
</xsd:simpleType>

XML/XML Schema    17/9/2002

8/20


 
 
 
 
 

Type liste

 


<xsd:simpleType name="ListeRegion">
  <xsd:list itemType="Region"/>
</xsd:simpleType>

<xsd:element name="regions" type="ListeRegion"/>

Elément de type liste de régions :


<regions>Alsace PACA</regions>

XML/XML Schema    17/9/2002

9/20


 
 
 
 
 

Type simple avec attribut

 

Déclaration d'un élément de type simple avec attribut


 <xsd:element name="price">
   <xsd:complexType>
    <xsd:simpleContent>
     <xsd:extension base="xsd:decimal">
      <xsd:attribute name="currency" type="xsd:string" />
     </xsd:extension>
    </xsd:simpleContent>
   </xsd:complexType>
 </xsd:element>

Elément


<price currency="EUR">423.46</>

XML/XML Schema    17/9/2002

10/20


 
 
 
 
 

Type dérivé par extension

 

Un type peut être dérivé d'un autre par extension

Ici on ajoute un élément URI à un type bookType


<xsd:complexType name='eBookType'>
    <xsd:complexContent>
	<xsd:extension base='bookType'>
		<xsd:sequence>
			<xsd:element name='URI' type='uriReference'/>
		</xsd:sequence>
	</xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

XML/XML Schema    17/9/2002

11/20


 
 
 
 
 

Utiliser un type dérivé dans un document

 

Déclaration d'un élément item de type bookType


<xsd:element name="item" type="bookType"/>

Elément item standard (i.e. de type bookType):


<s:item>
	<s:author> ...</s:author>
	...
	<s:date>..</s:date>
</s:item>

Elément item de type eBookType :


<s:item xsi:type="eBookType">
	<s:author> ...</s:author>
	...
	<s:date>..</s:date>
	<s:URI> ...</s:URI>
</s:item>

Si l'on utilise un type dérivé dans le document, à la place du type de base, il faut le signaler.


XML/XML Schema    17/9/2002

12/20


 
 
 
 
 

Contrainte d'intégrité : unicité

 

La valeur de l'attribut code des éléments regions/zip est unique


<xsd:unique name="dummy1">
       <xsd:selector xpath='regions/zip'/>
       <xsd:field xpath='@code'/>
</xsd:unique>

XML/XML Schema    17/9/2002

13/20


 
 
 
 
 

Contrainte d'intégrité : clé et référence

 

Toute clé référencée doit être définie. Exemple : référence bibliographique


<para>....<bibref code="Corby1999"/> ...</para>

<bibliography>
	<bibitem code="Corby1999">
		<author>Olivier Corby</author>
		...
	</bibitem>
</biliograpgy>

Définition de la clé bibitem/@code et de la référence bibref/@code


<xsd:key name="bib">
	<xsd:selector xpath='bibitem'/>
	<xsd:field xpath='@code'/>
</xsd:key>

<xsd:keyref name="dummy" refer="bib">
	<xsd:selector xpath='bibref'/>
	<xsd:field xpath='@code'/>
</xsd:keyref>

XML/XML Schema    17/9/2002

14/20


 
 
 
 
 

Autres

 

Equivalence entre éléments :


<xsd:element name="comment" 	type="string" />

<xsd:element name="shipComment" type="string" substitutionGroup="ipo:comment" />

<xsd:element name="customerComment" type="string" substitutionGroup="ipo:comment" />

Groupe d'éléments


<xsd:group name="shipAndBill">
	<xsd:sequence>
                <xsd:element name="shipTo" type="USAddress" />
                <xsd:element name="billTo" type="USAddress" />
        </xsd:sequence>
</xsd:group>

<xsd:group   ref="shipAndBill" />

Groupe d'attributs


<xsd:attributeGroup name="ItemDelivery">
              <xsd:attribute name="partNum" type="SKU"/>
              <xsd:attribute name="weightKg"  type="xsd:decimal"/>
</xsd:attributeGroup>

<xsd:attributeGroup ref="ItemDelivery"/>

XML/XML Schema    17/9/2002

15/20


 
 
 
 
 

Autres

 

Union type


<xsd:simpleType name="zipUnion">
     <xsd:union memberTypes="USState listOfMyIntType"/>
</xsd:simpleType>

Union of different kinds of types :


<xsd:simpleType>
    <xsd:union>
	<xsd:simpleType>
             <xsd:restriction base='nonNegativeInteger'/>
        </xsd:simpleType>
        <xsd:simpleType>
             <xsd:restriction base='string'>
                  <xsd:enumeration value='unbounded'/>
             </xsd:restriction>
        </xsd:simpleType>
    </xsd:union>
</xsd:simpleType>

XML/XML Schema    17/9/2002

16/20


 
 
 
 
 

Autres

 

Mixed content :


<xsd:element name="letterBody">
      <xsd:complexType mixed="true">
	  <xsd:element .>
      </xsd:complexType>
</xsd:element>

Any type :


<xsd:element name='anything' type='xsd:anyType'>
<xsd:element name='anything'/>

Empty content type:


<xsd:element name='vacuum'>
	<xsd:complexType>
		<xsd:attribute .>
	</xsd:complexType>
</xsd:element>

null content :

<xsd:element name="shipDate" type="xsd:date" nillable="true"/> 

<shipDate xsi:nil="true"></shipDate> 

XML/XML Schema    17/9/2002

17/20


 
 
 
 
 

Autres

 

Abstract : ne peut être utilisé dans un document :

<xsd:element name="comment" type="string" abstract="true"/>

<xsd:complexType name="Vehicle" abstract="true"/> 

Limiter la dérivation de types :

<xsd:complexType name="Address" final="restriction|extension|#all">

Limiter l'utilisation d'un type dérivé à la place d'un type de base dans un document :

<xsd:complexType name="Address" block='restriction|extension|#all'>

XML/XML Schema    17/9/2002

18/20


 
 
 
 
 

Autres

 

targetNamespace


<schema xmlns="http://www.w3.org/2001/XMLSchema"
      targetNamespace='http://www.inria.fr/acacia'>
...
</schema>

Référence au schema dans un document


<s:document xmls:xsi='http://www.w3.org/2001/XMLSchema-instance' 
	xsi:schemaLocation='http://www.inria.fr/acacia 
			    http://www.inria.fr/acacia/pub/schema.xsd'
	xmls:s='http://www.inria.fr/acacia'>

....

</s:document>

documentation


<xsd:annotation>
    <xsd:documentation>XML Schema is not de la tarte</xsd:documentation>
</xsd:annotation>

XML/XML Schema    17/9/2002

19/20


 
 
 
 
 

Autres

 


<xsd:any namespace='a namespace | ##targetNamespace | ##any | ##local | ##other' 
	processContents='skip | lax | strict'/>

<xsd:anyAttribute namespace='...'/>

length, minLength, maxLength

totalDigits
fractionDigits

prohibited

<xsd:include schemaLocation='http://...' />

<xsd:redefine schemaLocation='http://...'/>

elementFormDefault='qualified' for local elements only
attributeFormDefault='qualified' for local attributes only
form='qualified'
blockDefault='#all'


global definition and ref=''

multiple local definitions of element with same name and different types


XML/XML Schema    17/9/2002

20/20