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="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="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) :
<name>John Smith</name>
</customer>
Ou comme ceci :
<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 :
Voici un fragment d'un schéma XML :
<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) :
<name>John Smith</name>
</customer>
Mais le document suivant n'est plus valide :
<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