XSD Substitution d'éléments


Grâce à XML Schema, un élément peut en remplacer un autre.


Substitution d'éléments

Illustrons : Nos utilisateurs viennent du Royaume-Uni et de Norvège. Nous voulons donner aux utilisateurs la possibilité de choisir s'ils utilisent des noms d'éléments norvégiens ou anglais dans les documents XML.

Pour résoudre ce problème, nous pouvons définir unsubstitutionGroup. D'abord, nous déclarons l'élément principal, puis nous déclarons des éléments secondaires, qui peuvent déclarer qu'ils peuvent remplacer l'élément principal.

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>

Dans l'exemple ci-dessus, l'élément "name" est l'élément principal, et l'élément "navn" peut remplacer l'élément "name".

Voici un fragment d'un schéma XML :

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>

<xs:element name="customer" type="custinfo"/>
<xs:element name="kunde" substitutionGroup="customer"/>

Un document XML valide ressemblerait à ceci (selon le schéma ci-dessus) :

<customer>
  <name>John Smith</name>
</customer>

Ou comme ceci :

<kunde>
  <navn>John Smith</navn>
</kunde>


Blocage de la substitution d'éléments

Pour empêcher d'autres éléments de substituer un élément spécifié, utilisez l'attribut block :

<xs:element name="name" type="xs:string" block="substitution"/>

Voici un fragment d'un schéma XML :

<xs:element name="name" type="xs:string" block="substitution"/>
<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>

<xs:element name="customer" type="custinfo" block="substitution"/>
<xs:element name="kunde" substitutionGroup="customer"/>

Un document XML valide devrait ressembler à ceci (d'après le schéma ci-dessus) :

<customer>
  <name>John Smith</name>
</customer>

Mais le document suivant n'est plus valide :

<kunde>
  <navn>John Smith</navn>
</kunde>


Utilisation de substitutionGroup

Le type de l'élément substituable doit être identique à celui de l'élément principal, ou dérivé de l'élément principal. Si le type de l'élément substituable est identique au type de l'élément principal, vous n'avez pas besoin de spécifier le type de l'élément substituable.

Notez que tous les éléments (l'élément principal et les éléments substituables) dans le substitutionGroup doivent être déclarés comme éléments globaux, sinon cela ne fonctionnera pas !


Que sont les éléments globaux ?

Les éléments globaux sont des enfants directs de l'élément "schema" ! Les éléments locaux sont des éléments imbriqués dans d'autres éléments.

Autres extensions