Leçons de niveau 14

Extensible Markup Language/XML Schema

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du chapitre
XML Schema
Icône de la faculté
Chapitre no 3
Leçon : Extensible Markup Language
Chap. préc. :DTD
Chap. suiv. :Fonctions XPath
fin de la boite de navigation du chapitre
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Extensible Markup Language : XML Schema
Extensible Markup Language/XML Schema
 », n'a pu être restituée correctement ci-dessus.

Introduction[modifier | modifier le wikicode]

Limitations des DTD[modifier | modifier le wikicode]

Lors de son lancement, XML a été perçu comme une réelle chance pour les développeurs d’avoir à disposition un langage simple d’utilisation, portable sans difficulté d'une machine -et d'une application- à une autre, et libre de droits. Dans les premiers temps, un fichier XML, si on voulait le standardiser en utilisant un vrai langage général de description, devait dépendre d'une DTD. Mais ce format de description, hérité de SGML, souffre de nombreuses déficiences :

  1. Premièrement, les DTD ne sont pas au format XML. Cela signifie qu’il est nécessaire d’utiliser un outil spécial pour "parser" un tel fichier, différent de celui utilisé pour l'édition du fichier XML.
  2. Deuxièmement, les DTD ne supportent pas les "espaces de nom" (nous reviendrons sur cette notion plus loin). En pratique, cela implique qu’il n’est pas possible, dans un fichier XML défini par une DTD, d'importer des définitions de balises définies par ailleurs.
  3. Troisièmement, le "typage" des données est extrêmement limité.

Apports des schémas[modifier | modifier le wikicode]

Conçu pour pallier les déficiences pré-citées des DTD, XML Schema propose des nouveautés en plus des fonctionnalités fournies par les DTD :

  • Le typage des données est introduit, ce qui permet la gestion de booléens, d'entiers, d'intervalles de temps... Il est même possible de créer de nouveaux types à partir de types existants.
  • La notion d'héritage. Les éléments peuvent hériter du contenu et des attributs d'un autre élément. C'est sans aucun doute l'innovation la plus intéressante de XML Schema.
  • Le support des espaces de nom.
  • Les indicateurs d'occurrences des éléments peuvent être tout nombre non négatif (rappel : dans une DTD, on était limité à 0, 1 ou un nombre infini d'occurrences pour un élément).
  • Les schémas sont très facilement concevables par modules.

Les premiers pas[modifier | modifier le wikicode]

Introduction[modifier | modifier le wikicode]

Le but d'un schéma est de définir une classe de documents XML. Il permet de décrire les autorisations d'imbrication et l’ordre d'apparition des éléments et de leurs attributs, tout comme une DTD. Mais il permet aussi d'aller au-delà.

Un premier point intéressant est qu'un fichier Schema XML est un document XML. Cela permet à un tel document d’être manipulé de la même manière que n’importe quel autre fichier XML, et en particulier par une feuille de style XSL. Par exemple, il est notamment possible d'automatiser la création d'une documentation à partir d'un schéma, fondée sur les commentaires et explications qui s'y trouvent. Le vocabulaire de XML Schema est composé d'environ 30 éléments et attributs. Ce vocabulaire est, de manière bizarrement récursive et "auto-référente", défini dans un Schéma. Mais il existe également une DTD.

Structure de base[modifier | modifier le wikicode]

Comme tout document XML, un Schema XML commence par un prologue, et a un élément racine.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <!-- déclarations d'éléments, d'attributs et de types ici -->
</xsd:schema>

L'élément racine est l'élément xsd:schema. Pour le moment, oubliez l'attribut xmlns:xsd (dont le rôle est le même que celui que nous verrons lors du cours sur les feuilles de style), et qui fait référence à l’espace de noms utilisé pour l'écriture du fichier. Il faut simplement retenir que tout élément d'un schéma doit commencer par le préfixe xsd.

Nous allons voir, par la suite, comment déclarer éléments et attributs à l'aide d'un schéma.

Déclarations d'éléments et d'attributs[modifier | modifier le wikicode]

Déclarations d'éléments[modifier | modifier le wikicode]

Un élément, dans un schéma, se déclare avec la balise <xsd:element>. Par exemple,

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="contacts" type="typeContacts"></xsd:element>
 <xsd:element name="remarque" type="xsd:string"></xsd:element>
 <!-- déclarations de types ici -->
</xsd:schema>

Le schéma précédent déclare deux éléments : un élément contacts et un élément remarque. Chaque élément est "typé" -c'est-à-dire qu’il doit respecter un certain format de données. L'élément contacts est ainsi du type typeContacts, qui est un type complexe défini par l'utilisateur. L'élément remarque quant à lui est du type xsd:string qui est un type simple prédéfini de XML Schema.

Chaque élément déclaré est associé à un type de données via l'attribut type. Les éléments pouvant contenir des élément-enfants ou posséder des attributs sont dits de type complexe, tandis que les éléments n'en contenant pas sont dits de type simple. Nous reviendrons plus loin sur cette notion de type de données.

Déclarations d'attributs[modifier | modifier le wikicode]

Déclaration simple[modifier | modifier le wikicode]

À la différence des éléments, un attribut ne peut être que de type simple. Cela signifie que les attributs, comme avec les DTD, ne peuvent contenir d'autres éléments ou attributs. De plus, les déclarations d'attributs doivent être placées après les définitions des types complexes, autrement dit, après les éléments <xsd:sequence>, <xsd:choice> et <xsd:all> (voir plus loin). Pour mémoire, rappelons que dans une DTD, l’ordre des déclarations n'a pas d'importance.

L'exemple suivant montre la déclaration d'un attribut maj de type xsd:date (un autre type simple) qui indique la date de dernière mise à jour de la liste des contacts.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="remarque" type="xsd:string" />
  <xsd:element name="contacts">
    <!-- déclarations de types ici -->
    <xsd:complexType>
    <!-- déclarations du modèle de contenu ici -->
      <xsd:attribute name="maj" type="xsd:date" />
    </xsd:complexType>
</xsd:element>
</xsd:schema>

Contraintes d'occurrences[modifier | modifier le wikicode]

Tout comme dans une DTD, un attribut peut avoir un indicateur d'occurrences.

L'élément attribute d'un Schema XML peut avoir trois attributs optionnels : use, default et fixed. Des combinaisons de ces trois attributs permettent de paramétrer ce qui est acceptable ou non dans le fichier XML final (attribut obligatoire, optionnel, possédant une valeur par défaut...). Par exemple, la ligne suivante permet de rendre l'attribut maj optionnel, avec une valeur par défaut au 11 octobre 2003 s'il n'apparaît pas (le format de date est standardisé : cette date s'écrit donc à l'anglo-saxonne 2003/10/11 ; cela permet en outre de plus facilement classer les dates).

<xsd:attribute name="maj" type="xsd:date" use="optional" default="2003-10-11" />

Quand l'attribut fixed est renseigné, la seule valeur que peut prendre l'attribut déclaré est celle de l'attribut fixed. Cet attribut permet de "réserver" des noms d'attributs pour une utilisation future, dans le cadre d'une mise à jour du schéma.

Le tableau suivant présente une comparaison entre le format DTD et le XML Schema.

DTD Attribut use Attribut default Commentaire
#REQUIRED required -
"blabla" #REQUIRED required blabla
#IMPLIED optional -
"blabla" #IMPLIED optional blabla
- prohibited - Cet attribut ne doit pas apparaître
Table 1. Contraintes d'occurrences fixables par les attributs use et default.


Il est à noter que la valeur de l'attribut default doit être conforme au type déclaré. Par exemple...

<xsd:attribute name="maj" type="xsd:date" use="optional" default="-43" />

... produirait une erreur à la validation du schéma.

Un autre type de déclaration d'attributs dans les DTD, la liste de choix, est possible grâce à une restriction de type ; nous y reviendrons.

Regroupements d'attributs[modifier | modifier le wikicode]

XML Schema propose une fonctionnalité supplémentaire, permettant de déclarer des groupes d'attributs (groupes auxquels il est possible de faire appel lors d'une déclaration d'éléments). Cela permet d’éviter de répéter des informations de déclarations.

Déclaration d'élément ne contenant que du texte avec un (ou plusieurs) attribut(s)[modifier | modifier le wikicode]

Un tel élément est de type complexe, car il contient au moins un attribut. Afin de spécifier qu’il peut contenir également du texte, on utilise l'attribut mixed de l'élément <xsd;complexType>. Par défaut, mixed="false". Il faut dans ce cas forcer mixed="true". Par exemple,

<xsd:element name="elt">
  <xsd:complexType mixed="true">
    <xsd:attribute name="attr" type="xsd:string" use="optional" />
  </xsd:complexType>
</xsd:element>

Déclaration et référencement[modifier | modifier le wikicode]

La procédure précédente de déclaration d'éléments peut amener à une structure de type "poupée russe" des déclarations. Pour des raisons de clarté, il est beaucoup plus avantageux d'ordonner ces déclarations, ainsi qu'on peut le voir sur cet exemple (on ne fera pas attention, pour le moment, aux "définitions de type").

Il est recommandé de commencer par déclarer les éléments et attributs de type simple, puis ceux de type complexe. On peut en effet faire "référence", dans une déclaration de type complexe, à un élément de type simple prélablement défini. Par exemple...

<xsd:element name="pages" type="xsd:positiveInteger" />
<xsd:element name="auteur" type="xsd:string" />
<xsd:element name="livre">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element ref="auteur" />
      <xsd:element ref="pages" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

Les types de données[modifier | modifier le wikicode]

Introduction[modifier | modifier le wikicode]

Ainsi que nous l'avons déjà brièvement signalé, XML Schema permet de spécifier des types de données bien plus finement que le langage DTD. Il distingue notamment types simples et types complexes.

Les types simples[modifier | modifier le wikicode]

Généralités[modifier | modifier le wikicode]

Les types de données simples ne peuvent comporter ni attributs, ni éléments enfants. Il en existe de nombreux, prédéfinis, mais il est également possible d’en "dériver" de nouveaux (nous reviendrons plus loin sur cette fonctionnalité). Enfin, il est possible de déclarer des "listes" de types.

Bibliothèque de types intégrés[modifier | modifier le wikicode]

Nombreux sont les types prédéfinis dans la bibliothèque de types intégrés de XML Schema. La figure suivante en donne la hiérarchie, et leur liste détaillée figure sur le site du W3C.


Les types de données les plus simples (les chaînes de caractères) que permettaient les DTD sont conservés, mais d'autres ont fait leur apparition. On pourra envisager, par exemple, dans un schéma décrivant un bon de commande, la déclaration d'un attribut quantite :

<xsd:attribute name="quantite" type="xsd:positiveInteger" use="optional" default="1" />

... qui force la valeur de l'attribut à être un entier positif. Un bon de commande XML suivant ce schéma, ayant une commande spécifiant quantite="-3" sera alors automatiquement refusé par le système. Un tel document peut dès lors être enregistré directement dans une base de données, sans contrôle supplémentaire sur ce point.

Listes[modifier | modifier le wikicode]

Les types listes sont des suites de types simples (ou atomiques). XML Schema possède trois types de listes intégrés : NMTOKENS, ENTITIES et IDREFS. Il est également possible de créer une liste personnalisée, par "dérivation" de types existants. Par exemple, si l’on déclare un élément :

<xsd:element name="telephone" type="numéroDeTelephone"/>

avec la définition de type :

<xsd:simpleType name="numéroDeTelephone">
  <xsd:list itemType="xsd:unsignedByte" />
</xsd:simpleType>

Un élément conforme à cette déclaration dans le document XML serait <telephone>01 44 27 60 11</telephone>.

Il est également possible d'indiquer des contraintes plus fortes sur les types simples ; ces contraintes s'appellent des "facettes". Elles permettent par exemple de limiter la longueur de notre numéro de téléphone à 10 nombres. Nous reviendrons sur les facettes.

Unions[modifier | modifier le wikicode]

Les listes et les types simples intégrés ne permettent pas de choisir le type de contenu d'un élément. On peut désirer, par exemple, qu'un type autorise soit un nombre, soit une chaîne de caractères particuliers. Il est possible de le faire à l'aide d'une déclaration d'union. Par exemple, sous réserve que le type simple numéroDeTelephone ait été préalablement défini (voir précédemment), on peut déclarer...

<xsd:element name="telephone" type="numéroDeTelephoneMnemoTechnique"/>

<xsd:simpleType name="numéroDeTelephoneMnemoTechnique">
  <xsd:union memberTypes="xsd:string numéroDeTelephone" />
</xsd:simpleType>

Les éléments suivants sont alors des "instances" valides de cette déclaration :

<telephone>18</telephone>
<telephone>Pompiers</telephone>

Les types complexes[modifier | modifier le wikicode]

Introduction[modifier | modifier le wikicode]

Un élément de type simple ne peut pas contenir de sous-élément. Il est nécessaire pour cela de le déclarer de type "complexe". On peut alors déclarer, des séquences d'éléments, des types de choix ou des contraintes d'occurrences.

Séquences d'éléments[modifier | modifier le wikicode]

Nous savons déjà comment, dans une DTD, nous pouvons déclarer un élément comme pouvant contenir une suite de sous-éléments dans un ordre déterminé. Il est bien sûr possible de faire de même avec un schéma.

On utilise pour ce faire l'élément xsd:sequence, qui reproduit l'opérateur , du langage DTD. Ainsi...

<xsd:complexType>
  <xsd:sequence>
    <xsd:element name="nom" type="xsd:string" />
    <xsd:element name="prenom" type="xsd:string" />
    <xsd:element name="dateDeNaissance" type="xsd:date" />
    <xsd:element name="adresse" type="xsd:string" />
    <xsd:element name="adresseElectronique" type="xsd:string" />
    <xsd:element name="telephone" type="numéroDeTelephone" />
  </xsd:sequence>
</xsd:complexType>

... est équivalent à une déclaration d'élément, dans une DTD, où apparaîtrait (nom, prenom, dateDeNaissance, adresse, adresseElectronique, telephone).

Choix d'élément[modifier | modifier le wikicode]

On peut vouloir modifier la déclaration de type précédente en stipulant qu'on doive indiquer soit l'adresse d'une personne, soit son adresse électronique. Pour cela, il suffit d’utiliser un élément xsd:choice :

<xsd:complexType name="typePersonne">
  <xsd:sequence>
    <xsd:element name="nom" type="xsd:string" />
    <xsd:element name="prenom" type="xsd:string" />
    <xsd:element name="dateDeNaissance" type="xsd:date" />
    <xsd:choice>
      <xsd:element name="adresse" type="xsd:string" />
      <xsd:element name="adresseElectronique" type="xsd:string" />
    </xsd:choice>
  </xsd:sequence>
  <xsd:element name="telephone" type="numéroDeTelephone" />
</xsd:complexType>

Ce connecteur a donc les mêmes effets que l'opérateur | dans une DTD.

L'élément all[modifier | modifier le wikicode]

Cet élément est une nouveauté par rapport aux DTD. Il indique que les éléments enfants doivent apparaître une fois (ou pas du tout), et dans n’importe quel ordre. Cet élément xsd:all doit être un enfant direct de l'élément xsd:complexType. Par exemple...

<xsd:complexType>
  <xsd:all>
    <xsd:element name="nom" type="xsd:string" />
    <xsd:element name="prenom" type="xsd:string" />
    <xsd:element name="dateDeNaissance" type="xsd:date" />
    <xsd:element name="adresse" type="xsd:string" />
    <xsd:element name="adresseElectronique" type="xsd:string" />
    <xsd:element name="telephone" type="numéroDeTelephone" />
  </xsd:all>
</xsd:complexType>

... indique que chacun de ces éléments peut apparaître une fois ou pas du tout (équivalent de l'opérateur ? dans une DTD), et que l’ordre des éléments n'a pas d'importance (cela n'a pas d'équivalent dans une DTD).

Les fils de l'élément xsd:all doivent impérativement apparaître au plus une fois, ce qui signifie que deux attributs, que nous allons voir maintenant, doivent être renseignés. Ces attributs sont minoccurs et maxoccurs.

Indicateurs d'occurrences[modifier | modifier le wikicode]

Dans une DTD, un indicateur d'occurrence ne peut prendre que les valeurs 0, 1 ou l'infini. On peut forcer un élément sselt à être présent 378 fois, mais il faut pour cela écrire (sselt, sselt..., sselt, sselt) 378 fois. XML Schema permet de déclarer directement une telle occurrence, car tout nombre entier non négatif peut être utilisé. Pour déclarer qu'un élément peut être présent un nombre illimité de fois, on utilise la valeur unbounded. Les attributs utiles sont minOccurs et maxOccurs, qui indiquent respectivement les nombres minimal et maximal de fois où un élément peut apparaître. Le tableau suivant récapitule les possibilités :

Dans une DTD Valeur de minOccurs Valeur de maxOccurs
* 0 unbounded
+ 1 (pas nécessaire, valeur par défaut) unbounded
? 0 1 (pas nécessaire, valeur par défaut)
rien 1 (pas nécessaire, valeur par défaut) 1 (pas nécessaire, valeur par défaut)
impossible nombre entier n quelconque nombre entier m quelconque supérieur ou égal à n
Table 2. Liste des indicateurs d'occurrence.

Création de type complexe à partir de types simples[modifier | modifier le wikicode]

Il est possible également de créer un type complexe à partir d'un type simple.

On peut avoir besoin de définir un élément contenant une valeur simple, et possédant un attribut, comme <poids unite="kg">67</poids>, par exemple. Un tel élément ne peut pas être déclaré de type simple, car il contient un attribut. Il faut dériver un type complexe à partir du type simple positiveInteger :

<xsd:complexType name="typePoids">
  <xsd:simpleContent>
    <xsd:extension base="xsd:positiveInteger">
      <xsd:attribute name="unite" type="xsd:string" />
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

L'élément <xsd:simpleContent> indique que le nouvel élément ne contient pas de sous-élément.

Espaces de nom[modifier | modifier le wikicode]

Introduction[modifier | modifier le wikicode]

La notion d'espace de nom est complexe ; elle permet à un document XML quelconque d’utiliser les balises définies dans un schéma donné... quelconque. Nous avons déjà utilisé cette notion dans un schéma, où nous utilisions des éléments préfixés par xsd, après avoir écrit <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">.

Cela signifie que l'espace de nom auquel ces balises font référence, là où elles sont définies, est un schéma particulier, que l’on peut consulter.

Comment lier un fichier XML à un schéma ?[modifier | modifier le wikicode]

Nous n'allons pas ici entrer dans les détails de la notion d'espace de nom, mais simplement apprendre à valider un document XML d’après un Schema XML. On utilise pour ce faire le préfixe xmlns.

  • Nous avons déjà vu le cas, équivalent à une DTD de type PUBLIC, où le schéma est... public. Un schéma est en effet un document XML, et on trouve dans son élément racine l'attribut xmlns:xsd="http://www.w3.org/2001/XMLSchema". Cela signifie que dans le document, tous les éléments commençant par xsd sont référencés à cette URL. Donc si on a déposé un schéma à l'adresse http://www.monsite.org/collection_schemas/biblio, on peut l'appeler par <xsd:biblio xmlns="http://www.monsite.org/collection_schemas/biblio">.
  • Dans le cas d'une référence locale, correspondant à une DTD de type SYSTEM, on fait référence au schéma dans le document XML en utilisant l'attribut noNamespaceSchemaLocation, par <biblio xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="lien_relatif_vers_le_schema">.

Par exemple :

<biblio xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="biblio10.xsd">.

Les dérivations[modifier | modifier le wikicode]

Introduction[modifier | modifier le wikicode]

Les types simples et complexes permettent déjà de faire plus de choses que les déclarations dans le langage DTD. Il est possible de raffiner leur déclaration de telle manière qu’ils soient une "restriction" ou une "extension" d'un type déjà existant, en vue de préciser un peu plus leur forme. Nous allons nous limiter dans ce cours d'initiation à la restriction des types simples.

Restriction de type[modifier | modifier le wikicode]

Généralités[modifier | modifier le wikicode]

On peut appliquer une "dérivation" aussi bien à un type simple, qu’à un type complexe. La dérivation par restriction permet de créer de nouveaux types simples à partir des types simples prédéfinis par le format XML Schema. On utilise pour ce faire des "facettes", qui sont des contraintes supplémentaires appliquées à un type simple particulier.

Une "facette" permet de placer une contrainte sur l’ensemble des valeurs que peut prendre un type de base. Par exemple, on peut souhaiter créer un type simple, appelé MonEntier, limité aux valeurs comprises entre 0 et 99 inclus. On dérive ce type à partir du type simple prédéfini nonNegativeInteger, en utilisant la facette maxExclusive.

<xsd:simpleType name="monEntier">
  <xsd:restriction base="nonNegativeInteger">
    <xsd:maxExclusive value="100" />
  </xsd:restriction>
</xsd:simpleType>

Il existe un nombre important de facettes qui permettent de :

  • fixer, restreindre ou augmenter la longueur minimale ou maximale d'un type simple
  • énumérer toutes les valeurs possibles d'un type
  • prendre en compte des expressions régulières
  • fixer la valeur minimale ou maximale d'un type (voir l'exemple ci-dessus)
  • fixer la précision du type...

Exemples[modifier | modifier le wikicode]

On peut utiliser cette fonctionnalité pour reproduire ce qui, dans les DTD, permettait de limiter les valeurs de certains attributs. Ainsi...

<xsd:attribute name="jour" type="typeJourSemaine" use="required" />
<xsd:simpleType name="typeJourSemaine">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="lundi" />
    <xsd:enumeration value="mardi" />
    <xsd:enumeration value="mercredi" />
    <xsd:enumeration value="jeudi" />
    <xsd:enumeration value="vendredi" />
    <xsd:enumeration value="samedi" />
    <xsd:enumeration value="dimanche" />
  </xsd:restriction>
</xsd:simpleType>

Pour limiter la longueur d'une chaîne :

<xsd:simpleType name="typeMotLangueFrancaise">
  <xsd:restriction base="xsd:string">
    <xsd:length value="21" />
  </xsd:restriction>
</xsd:simpleType>

Plus complexe, on peut utiliser des expressions régulières, qui permettent de spécifier quels sont les caractères autorisés, à l'aide de l'élément <xsd:pattern>. Par exemple...

<xsd:simpleType name="typeAdresseElectronique">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="(.)+@(.)+" />
  </xsd:restriction>
</xsd:simpleType>

Dans cet exemple, (.)+ signifie que l’on peut mettre n’importe quel caractère au moins une fois, et qu'entre les deux chaînes doit impérativement apparaître le caractère @.

Un numéro ISBN est un référent international pour une publication. Il s'agit d'un numéro à 10 ou 13 chiffres. On peut le déclarer ainsi :

<xsd:simpleType name="typeISBN">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="[0-9]{10}|[0-9]{13}" />
  </xsd:restriction>
</xsd:simpleType>

Bien sûr, toutes les facettes ne sont pas acceptées par tous les types. Il serait fastidieux ici d’en donner la liste ; elle est accessible sur le site du W3C à l'adresse http://www.w3.org/TR/xmlschema-0/#SimpleTypeFacets.

Diverses autres fonctionnalités[modifier | modifier le wikicode]

Inclusion de schémas[modifier | modifier le wikicode]

Un Schema XML a rapidement tendance à devenir... verbeux. Autrement dit, il devient rapidement suffisamment long pour que sa complexité apparente rebute l'œil humain. Il est alors plus raisonnable de le scinder en plusieurs morceaux, chacun chargé de définir précisément tel ou tel sous-domaine du schéma. Il est alors possible d'inclure plusieurs schémas dans un seul, à l'aide de l'élément xsd:include. Cela offre de plus l'énorme avantage de modulariser un schéma, et donc de pouvoir sans difficulté importer certaines parties à partir de schémas déjà existants. Nul besoin de réinventer la roue, ou de procéder à de massifs "copier/coller", en ayant besoin de tout reprendre à chaque fois que l’on fait une mise à jour.

Supposons par exemple que nous ayons défini le schéma d'une bibliographie dans le cadre plus général de l'écriture d'un mémoire. Ce Schema XML est stocké à l'URL http://www.monsite.org/schemas/biblio.xsd. Nous avons besoin d'une bibliographie pour une autre application -par exemple, lister un ensemble de ressources pour un site Web de e-formation. Nous pouvons inclure le schéma précédemment écrit à l'aide de la commande...

<xsd:include schemaLocation="http://www.monsite.org/schemas/biblio.xsd" />

Il s'agit d'une sorte de "copier-coller" du contenu de la bibliographie dans le schéma en cours d'écriture. La seule condition est que le targetNameSpace soit le même dans le Schema XML inclus et dans le Schema XML importateur.

Documentation[modifier | modifier le wikicode]

XML Schema permet, outre l’utilisation des commentaires comme tout format XML, l'adjonction de documentation aux éléments.

La documentation à l'intention des lecteurs humains peut être définie dans des éléments xsd:documentation, tandis que les informations à l'intention de programmes doivent être incluses dans des éléments xsd:appinfo. Ces deux éléments doivent être placés dans un élément xsd:annotation. Ils disposent d'attributs optionnels : xml:lang et source, qui est une référence à une URI pouvant être utilisée pour identifier l'objectif du commentaire ou de l'information.

Les élémenst xsd:annotation peuvent être ajoutés au début de la plupart des constructions. Voir par exemple le schéma biblio10.xsd déjà donné.

Attribut null[modifier | modifier le wikicode]

Il est toujours préférable de pouvoir indiquer explicitement qu'un élément est non renseigné plutôt que d'omettre cet élément. La valeur null des bases de données relationnelles est utilisée dans ce but. XML Schema intègre un mécanisme similaire permettant d'indiquer qu'un élément peut être non renseigné.

Nous déclarons maintenant l'élément courriel comme pouvant être null à l'aide de l'attribut nullable du vocabulaire de XML Schema :

<personne>
  <nom>Jean Dupont</nom>
  <courriel xsi:null></courriel>
</personne>

Cet attribut doit toujours être préfixé par xsi. Quant à l'élément portant cet attribut, il peut contenir d'autres attributs, mais pas de sous-élément.