• Aucun résultat trouvé

5. Schémas XML

5.13. Espaces de noms

Un des avantages des schémas par rapport aux DTD est la prise en charge des espaces de noms [Chapitre 4]. L'attribut targetNamespace de l'élément xsd:schema [Section 5.3.1] permet de préciser l'espace de noms des éléments et des types définis par le schéma.

5.13.1. Schéma sans espace de noms

Pour une utilisation plus simple, il est possible d'ignorer les espaces de noms. Il est alors possible de valider des documents dont tous les éléments n'ont pas d'espace de noms. Il suffit, pour cela, que les noms des éléments du document ne soient pas qualifiés (sans le caractère ':') et que l'espace de noms par défaut [Section 4.5] ne soit pas spécifié.

Si l'attribut targetNamespace de l'élément xsd:schema est absent, tous les éléments et types définis dans le schéma sont sans espace de noms. Il faut cependant déclarer l'espace de noms des schémas pour qualifier les éléments des schémas (xsd:element, xsd:complexType, ...).

5.13.2. Espace de noms cible

Pour spécifier un espace de noms cible dans lequel sont définis les éléments, l'attribut targetNamespace de l'élément xsd:schema [Section 5.3.1] doit contenir l'URI associé à cet espace de noms. La valeur de l'attribut elementFormDefault de l'élément xsd:schema détermine quels éléments sont effectivement définis dans l'espace de noms.

La valeur par défaut de l'attribut elementFormDefault est unqualified. Quand la valeur de elementFormDefault est unqualified, seuls les éléments définis globalement, c'est-à-dire quand l'élément xsd:element est directement enfant de l'élément xsd:schema sont dans l'espace de noms cible. Les autres éléments sont sans espace de noms. Dans le schéma suivant, l'élément global name est dans l'espace de noms identifié par l'URI http://www.omega-one.org/~carton/ alors que les deux éléments locaux firstname et lastname sont sans espace de noms.

<?xml version="1.0" encoding="iso-8859-1"?>

<!-- unqualified est la valeur par défaut de elementFormDefault --> <xsd:schema targetNamespace="http://www.omega-

one.org/~carton/" elementFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="name"> <xsd:complexType> <xsd:sequence>

<xsd:element name="firstname" type="xsd:string"/> <xsd:element name="lastname" type="xsd:string"/> </xsd:sequence>

</xsd:complexType> </xsd:element> </xsd:schema>

Le document suivant est valide pour le schéma précédent.

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <tns:name xmlns:tns="http://www.omega-one.org/~carton/">

<firstname>Gaston</firstname> <lastname>Lagaffe</lastname> </tns:name>

Si la valeur de l'attribut elementFormDefault est qualified, tous les éléments sont dans l'espace de noms cible. Dans le schéma suivant, les trois éléments name, firstname et lastname sont dans l'espace de noms http://www.omega-one.org/~carton/.

Schémas XML

<?xml version="1.0" encoding="iso-8859-1"?>

<xsd:schema targetNamespace="http://www.omega-one.org/~carton/" elementFormDefault="qualified"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="name">

<xsd:complexType> <xsd:sequence>

<xsd:element name="firstname" type="xsd:string"/> <xsd:element name="lastname" type="xsd:string"/> </xsd:sequence>

</xsd:complexType> </xsd:element>

</xsd:schema>

Le document suivant est valide pour le schéma précédent.

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <tns:name xmlns:tns="http://www.omega-one.org/~carton/">

<tns:firstname>Gaston</tns:firstname> <tns:lastname>Lagaffe</tns:lastname> </tns:name>

Le comportement pour les attributs est identique mais il est gouverné par l'attribut attributeFormDefault de l'élément xsd:schema. La valeur par défaut de cet attribut est aussi unqualified.

Les éléments et attributs définis globalement sont toujours dans l'espace de noms cible. Pour les éléments et attributs locaux, il est possible de changer le comportement dicté par elementFormDefault et attributeFormDefault en utilisant l'attribut form des éléments xsd:element et xsd:attribute. Cet attribut peut prendre les valeurs qualified ou unqualified. Le schéma suivant spécifie que l'élément firstname doit être qualifié. Tous les autres éléments locaux comme lastname n'ont pas à être qualifiés car la valeur par défaut de l'attribut elementFormDefault est unqualified.

<?xml version="1.0" encoding="iso-8859-1"?>

<xsd:schema targetNamespace="http://www.omega-one.org/~carton/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="name"> <xsd:complexType>

<xsd:sequence>

<xsd:element name="firstname" type="xsd:string" form="qualified"/> <xsd:element name="lastname" type="xsd:string"/>

</xsd:sequence> </xsd:complexType> </xsd:element>

</xsd:schema>

Le document suivant est valide pour le schéma précédent.

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <tns:name xmlns:tns="http://www.omega-one.org/~carton/"> <tns:firstname>Gaston</tns:firstname>

<lastname>Lagaffe</lastname> </tns:name>

5.13.3. Noms qualifiés

Lorsqu'un élément [Section 5.4.4], un attribut [Section 5.7], un groupe d'éléments, un groupe d'attributs [Section 5.11] ou encore un type défini globalement est référencé par un attribut ref ou type, la valeur de cet attribut doit contenir le nom qualifié. Ceci oblige à associer un préfixe à l'espace de noms cible et à l'utiliser pour qualifier l'élément ou le type référencé comme dans le schéma suivant.

Schémas XML

Les éléments, attributs, groupes et types doivent être nommés avec un nom non qualifié quand ils sont déclarés ou définis. Ils sont à ce moment implicitement qualifiés par l'espace de nom cible. Ceci signifie que les noms apparaissant dans l'attribut name de xsd:element, xsd:attribute, xsd:group, xsd:attributeGroup, xsd:simpleType et xsd:complexType sont toujours des noms locaux, c'est- à-dire sans préfixe.

<?xml version="1.0" encoding="iso-8859-1"?>

<xsd:schema targetNamespace="http://www.omega-one.org/~carton/" elementFormDefault="qualified"

xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.omega-one.org/~carton/"> <!-- Référence au type Name par son nom qualifié --> <!-- Le nom name de l'élément déclaré n'est pas qualifié --> <xsd:element name="name" type="tns:Name" />

<!-- Le nom Name du type défini n'est pas qualifié --> <xsd:complexType name="Name">

<xsd:sequence>

<xsd:element name="firstname" type="xsd:string"/> <xsd:element name="lastname" type="xsd:string"/> </xsd:sequence>

</xsd:complexType> </xsd:schema>

Dans l'exemple précédent, le type Name est référencé par son nom qualifié dans la déclaration de l'élément name. De la même façon, toute référence à un élément déclaré globalement ou à un groupe d'éléments ou d'attributs utilise un nom qualifié. Dans l'exemple suivant, l'élément name apparaît dans la définition d'un autre type Tree qui pourrait être ajoutée au schéma précédent. La définition de ce type est récursive et la référence à lui-même utilise bien sûr le nom qualifié.

<?xml version="1.0" encoding="utf-8"?>

<xsd:schema targetNamespace="http://www.omega-one.org/~carton/" xmlns:tns="http://www.omega-one.org/~carton/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!-- Déclaration des éléments globaux name et tree --> <xsd:element name="name" type="xsd:string"/>

<!-- Référence au type Tree par son nom qualifié --> <xsd:element name="tree" type="tns:Tree"/>

<xsd:complexType name="Tree"> <xsd:sequence>

<!-- Référence à l'élément global name par son nom qualifié --> <xsd:element ref="tns:name"/>

<!-- Référence récursive au type Tree par son nom qualifié --> <!-- Le nom child de l'élément déclaré n'est pas qualifié -->

<xsd:element name="child" type="tns:Tree" minOccurs="0" maxOccurs="2"/> </xsd:sequence>

</xsd:complexType> </xsd:schema>

L'utilisation de minOccurs avec la valeur 0 pour l'élément child est indispensable pour terminer la récursivité. Sinon, aucun document valide ne peut avoir d'élément de type Tree. Le document suivant est valide pour le schéma précédent. Les éléments globaux tree et name doivent être qualifiés dans le document alors que l'élément local child ne doit pas l'être.

<?xml version="1.0" encoding="iso-8859-1"?>

<tns:tree xmlns:tns="http://www.omega-one.org/~carton/"> <tns:name>Racine</tns:name>

<child>

Schémas XML

<child><tns:name>Petit fils</tns:name></child> </child>

<child><tns:name>Fils Droit</tns:name></child> </tns:tree>

Il est souvent assez lourd de qualifier chacun des noms des objets définis dans le schéma. Une alternative assez commode consiste à rendre l'espace de noms par défaut égal à l'espace de noms cible comme dans l'exemple suivant. Ceci impose bien sûr de ne pas utiliser l'espace de noms par défaut pour les éléments des schémas comme il pourrait être tentant de le faire. Dans la pratique, on associe l'espace de noms par défaut à l'espace de noms cible et on déclare également un préfixe pour cet espace de noms afin de pouvoir y faire référence de façon explicite. Dans l'exemple suivant, l'espace de noms cible identifié par l'URI http://www.omega-one.org/~carton/ est déclaré comme l'espace de noms par défaut et il est également associé au préfixe tns.

<?xml version="1.0" encoding="iso-8859-1"?> <xsd:schema targetNamespace="http://www.omega-

one.org/~carton/" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.omega-one.org/~carton/" xmlns:tns="http://www.omega-one.org/~carton/"> <!-- Référence au type Name par son nom qualifié --> <xsd:element name="name" type="Name" />

<!-- Définition du type Name --> <xsd:complexType name="Name">

<xsd:sequence>

<xsd:element name="firstname" type="xsd:string"/> <xsd:element name="lastname" type="xsd:string"/> </xsd:sequence>

</xsd:complexType> </xsd:schema>

Documents relatifs