Substitution d'éléments XSD
Avec les schémas XML, un élément peut remplacer un autre élément.
Substitution d'élément
Disons que nous avons des utilisateurs de deux pays différents : l'Angleterre et la Norvège. Nous aimerions pouvoir laisser l'utilisateur choisir s'il souhaite utiliser les noms d'éléments norvégiens ou les noms d'éléments anglais dans le document XML.
Pour résoudre ce problème, nous pourrions définir un substitutionGroup dans le schéma XML. Tout d'abord, nous déclarons un élément de tête, puis nous déclarons les autres éléments qui déclarent qu'ils sont substituables à l'élément de tête.
<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 head et l'élément "navn" est substituable à "name".
Regardez ce 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 (selon le schéma ci-dessus) pourrait ressembler à ceci :
<customer>
<name>John Smith</name>
</customer>
ou comme ceci :
<kunde>
<navn>John Smith</navn>
</kunde>
Substitution d'éléments bloquants
Pour empêcher d'autres éléments de se substituer à un élément spécifié, utilisez l'attribut block :
<xs:element name="name" type="xs:string" block="substitution"/>
Regardez ce 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 (selon le schéma ci-dessus) ressemble à ceci :
<customer>
<name>John Smith</name>
</customer>
MAIS CELA N'EST PLUS VALABLE :
<kunde>
<navn>John Smith</navn>
</kunde>
Utilisation du groupe de substitution
Le type des éléments substituables doit être identique ou dérivé du type de l'élément principal. Si le type de l'élément substituable est le même que le type de l'élément principal, vous n'aurez pas à spécifier le type de l'élément substituable.
Notez que tous les éléments du groupe substitution (l'élément principal et les éléments substituables) 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 éléments qui sont des enfants immédiats de l'élément "schema" ! Les éléments locaux sont des éléments imbriqués dans d'autres éléments.