Remplacement d'élément (Element Substitution) XSD

Grâce au schéma XML, un élément peut remplacer un autre élément.

Remplacement d'éléments

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 dans le document XML s'ils veulent utiliser les noms d'éléments en norvégien ou en anglais.

Pour résoudre ce problème, nous pouvons définir un substitutionGroupTout d'abord, nous déclarons l'élément principal, puis nous déclarons les é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".

Regardez un fragment de 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 valable 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"/>

Regardez un fragment de 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 valable 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>

Utilisez substitutionGroup

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

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 sous-é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.