Comment peut-on définir avec W3C XML Schema des contenus qui dépendent d'une valeur (pays ou nationalité par exemple)?
Eric van der Vlist,
Dyomedea (vdv@dyomedea.com).
vendredi 13 septembre 2002
J'aurais voulu savoir comment je pourrais valider un document XML dont le contenu varie suivant la valeur d'un attribut comme par exemple:
<enregistrement contenu="type1">
<a />
</enregistrement>
<enregistrement contenu="type2">
<b />
</enregistrement>
Où le contenu autorisé dans l'élément "enregistrement" dépend de la valeur de l'attribut "contenu".
Si vous tenez au nom de l'attribut "contenu", W3C XML Schema seul ne peut pas grand chose pour vous et vous devrez accepter que votre contenu soit le contenu "type1" ou "type2" quelque soit la valeur de l'attribut "contenu" en écrivant un schéma qui accepte toutes les combinaisons, par exemple:
<xs:element name="enregistrement">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="a" type="..."/>
</xs:sequence><xs:sequence>
<xs:element name="b" type="..."/>
</xs:sequence></xs:choice>
<xs:attribute name="contenu">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="type1"/>
<xs:enumeration value="type2"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
A ce schéma de base, vous pouvez éventuellement ajouter des règles XPath en utilisant le langage de schémas Schematron si vos applications le supportent.
Si par contre vous pouvez changer le nom de l'attribut "contenu" et utiliser à la place l'attribut "xsi:type" prévu à cet usage par W3C XML Schema, vous pouvez simplement déclarer votre élément "enregistrement" comme acceptant un type abstrait dont seront dérivés vos contenus possibles.
<xs:complexType name="generique" abstract="true">
<xs:sequence>
<xs:element name="a" type="..." minOccurs="0"/>
<xs:element name="b" type="..." minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="type1">
<xs:complexContent>
<xs:restriction base="generique">
<xs:sequence>
<xs:element name="a" type="..."/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="type2">
<xs:complexContent>
<xs:restriction base="generique">
<xs:sequence>
<xs:element name="b" type="..."/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:element name="enregistrement" type="generique"/>
Il ne reste plus ensuite qu'à déclarer dans vos éléments quel est le type utilisé:
<enregistrement xsi:type="type1">
<a/>
</enregistrement>
<enregistrement xsi:type="type2">
<b/>
</enregistrement>
Pascal EMMA: "[xml-tech] Schéma conditionnel"Eric van der Vlist: "[xml-tech] Re: Schéma conditionnel"Eric van der Vlist: "[xml-tech] Re: Schéma conditionnel"Pascal EMMA: "[xml-tech] Re: Schéma conditionnel"Charles Nepote: "[xml-tech] XML Schéma : choix d'un groupe d'élément déterminé par la valeur d'un attribut"Eric van der Vlist: "[xml-tech] Re: XML Schéma : choix d'un groupe d'élément déterminé par la valeur d'un attribut"LAMY Olivier: "[xml-tech] Utilisation de XPath dans les schémas"Eric van der Vlist: "[xml-tech] Re: Utilisation de XPath dans les schémas"
Copyright 2002,
Eric van der Vlist.
|