• Aucun résultat trouvé

Groupes d'éléments et d'attributs

5. Schémas XML

5.11. Groupes d'éléments et d'attributs

Il est possible de nommer des groupes d'éléments et des groupes d'attributs afin de pouvoir les réutiliser. Ce mécanisme aide à structurer un schéma complexe et vise à obtenir une meilleure modularité dans l'écriture des schémas. Les groupes d'éléments et d'attributs sont respectivement définis par les éléments xsd:group et xsd:attributeGroup.

Les groupes d'éléments ne doivent pas être confondus avec les groupes de substitution [Section 5.10.3] qui permettent de remplacer un élément par un autre.

5.11.1. Groupe d'éléments

L'élément xsd:group permet de définir un groupe d'éléments dont le nom est donné par l'attribut name. L'élément xsd:group doit être enfant de l'élément racine xsd:schema du schéma. Ceci signifie que la portée de la définition du groupe est le schéma tout entier. Le contenu de l'élément xsd:group est un fragment de type nécessairement inclus dans un élément xsd:sequence, xsd:choice ou xsd:all [Section 5.6].

Un groupe peut être employé dans la définition d'un type ou la définition d'un autre groupe. L'utilisation d'un groupe est équivalente à l'insertion de son contenu. L'intérêt d'un groupe est de pouvoir l'utiliser à plusieurs reprises et de factoriser ainsi les parties communes à plusieurs types. L'utilisation d'un groupe est introduite par un élément xsd:group avec un attribut ref qui donne le nom du groupe à insérer.

Dans le schéma suivant, le groupe FirstLast est défini puis utilisé dans la définition du groupe Name et du type Person ainsi que dans la définition du type anonyme de l'élément character.

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:group naine="FirstLast">

<xsd:sequence>

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

</xsd:group>

<xsd:group naine="Naine"> <xsd:choice>

<xsd:element name="name" type="xsd:string"/> <!-- Insertion du contenu du groupe FirstLast --> <xsd:group ref="FirstLast"/>

</xsd:choice> </xsd:group>

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

<xsd:element name="surname" type="xsd:string" minOccurs="0"/> <!-- Insertion du contenu du groupe Name -->

<xsd:group ref="Naine"/> </xsd:sequence> </xsd:complexType> <xsd:element name="characters"> <xsd:complexType> <xsd:sequence>

<xsd:element name="character" maxOccurs="unbounded"> <xsd:complexType>

<xsd:sequence>

<!-- Insertion du contenu du groupe Name --> <xsd:group ref="Naine"/>

<xsd:element name="creator" type="Person" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>

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

<characters> <character> <firstname>Gaston</firstname> <lastname>Lagaffe</lastname> <creator> <firstname>André</firstname> <lastname>Franquin</lastname> </creator> </character> <character> <name>Astérix</name> <creator> <surname>Al Uderzo</surname> <firstname>Albert</firstname> <lastname>Uderzo</lastname> </creator> <creator> <firstname>René</firstname> <lastname>Goscinny</lastname> </creator> </character>

Un groupe est en fait un fragment de type qui peut être utilisé à l'intérieur de la définition de n'importe quel type. En revanche, il ne peut pas servir comme type dans la déclaration d'un l'élément. À l'inverse, un type peut servir dans la déclaration d'éléments mais il ne peut pas être directement inclus par un autre type.

Les groupes sont en fait un mécanisme d'abréviation. Ils permettent d'accroître la modularité des schémas en évitant de recopier plusieurs fois le même fragment dans les définitions de différents types.

5.11.2. Groupe d'attributs

Les groupes d'attributs jouent, pour les attributs, un rôle similaire aux groupes d'éléments. Ils permettent de regrouper plusieurs déclarations d'attributs dans le but d'une réutilisation. L'élément xsd:attributeGroup permet de définir un groupe d'attributs dont le nom est donné par l'attribut name. L'élément xsd:attributeGroup doit être enfant de l'élément racine xsd:schema du schéma. Ceci signifie que la portée de la définition du groupe est le schéma tout entier. Le contenu de l'élément xsd:attributeGroup est constitué de déclarations d'attributs introduites par l'élément xsd:attribute [Section 5.7].

Dans l'exemple suivant, le groupe d'attributs LangType regroupe les déclaration des deux attributs lang et type.

<xsd:attributeGroup naine="LangType">

<xsd:attribute name="lang" type="xsd:language"/> <xsd:attribute name="type" type="xsd:string"/> </xsd:attributeGroup>

Un groupe d'attributs peut être employé dans la définition d'un type ou la définition d'un autre groupe d'attributs. L'utilisation d'un groupe est équivalente à l'insertion de son contenu. L'utilisation d'un groupe est introduite par un élément xsd:attributeGroup avec un attribut ref qui donne le nom du groupe à insérer.

Le groupe d'attributs LangType peut être employé de la façon suivante dans la définition d'un type complexe nommé ou anonyme. Tout élément du type SomeType défini ci-dessous pourra avoir les attributs lang et type déclarés dans le groupe LangType.

<xsd:complexType name="SomeType"> <!-- Contenu -->

...

<xsd:attributeGroup ref="LangType"/> </xsd:complexType>

Schémas XML

Il est possible d'utiliser successivement plusieurs groupes d'attributs pour déclarer les attributs d'un type mais il faut une occurrence de xsd:attributeGroup pour chaque groupe utilisé.

<xsd:attributeGroup ref="AttrGroup1"/> <xsd:attributeGroup ref="AttrGroup2"/>

Un groupe d'attributs peut aussi être utilisé dans la définition d'un autre groupe d'attributs. Le nouveau groupe défini contient tous les attributs du ou des groupes référencés en plus des attributs qu'il déclare explicitement. Ce mécanisme est semblable à l'héritage des classes dans les langages de programmation orientés objet.

<xsd:attributeGroup name="LangTypeClass"> <xsd:attributeGroup ref="LangType"/>

<xsd:attribute name="class" type="xsd:string"/> </xsd:attributeGroup>

Le schéma à l'adresse http://www.w3.org/2001/xml.xsd déclare les quatre attributs particuliers [Section 2.7.4] xml:lang, xml:space, xml:base et xml:id. Il définit également un groupe d'attributs xml:specialAttrs permettant de déclarer simultanément ces quatre attributs. Un exemple d'utilisation de celui-ci est donné dans la partie sur l'import de schémas [Section 5.14]. Cet exemple montre que les noms des groupes d'éléments et des groupes d'attributs sont des noms qualifiés dans l'espace de noms cible du schéma.

Documents relatifs