Remplacement d'éléments de XSD (Element Substitution)

Par le biais de XML Schema, un élément peut remplacer un autre élément.

Remplacement d'élément

Laissons nous expliquer par un exemple : nos utilisateurs viennent du Royaume-Uni et de la Norvège. Nous souhaitons être en mesure de permettre aux utilisateurs de choisir d'utiliser le nom d'élément en norvégien ou en anglais dans le document XML.

Pour résoudre ce problème, nous pouvons définir dans le schéma XML : substitutionGroup.Tout 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 cet exemple, l'élément "name" est l'élément principal, tandis que l'élément "navn" peut remplacer l'élément "name".

Voyons un extrait 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 ressemble à cela (selon le schéma ci-dessus) :

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

ou quelque chose comme cela :

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

Empêcher la substitution d'éléments

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

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

Voyons un extrait 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 à cela (selon le schéma ci-dessus) :

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

Mais le document suivant n'est plus valable :

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

Utilisation de substitutionGroup

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

Veuillez noter que tous les éléments (éléments principaux et éléments substituables) dans substitutionGroup doivent être déclarés comme éléments globaux, sinon ils ne fonctionneront pas !

Qu'est-ce que les éléments globaux (Global Elements) ?

Les éléments globaux sont les éléments directs de l'élément "schema" ! Les éléments locaux (Local elements) sont les éléments imbriqués dans d'autres éléments.