Bonjour,
Le mardi 14 décembre 2004 à 12:05 +0100, BoD a écrit :
> Bonjour,
>
> J'ai l'impression que je viens de tomber sur une question "classique".
Oui!
> J'essaye de construire un schéma pour quelquechose comme :
>
> <root>
> <elem1>truc<elem1>
> <elem2>toto</elem2>
>
> <!-- soit elem3, soit elem4 -->
> <elem3>titi</elem3>
> </root>
>
> Sachant que je veux que elem1, 2, 3 puissent apparaître dans n'importe
> quel ordre.
>
> Alors j'ai essayé :
>
> <xs:element name="root
> <xs:complexType>
> <xs:all>
> <xs:element name="elem1" type="xsd:String"/>
> <xs:element name="elem2" type="xsd:String"/>
> <xs:choice>
> <xs:element name="elem3" type="xs:String"/>
> <xs:element name="elem4" type="xs:String"/>
> </xs:choice>
> </xs:all>
> </xs:complexType>
> </xs:element>
>
> Qui ne marche pas car xs:all ne peut pas contenir un xs:choice.
Effectivement.
> Je me demande bien pourquoi.
Parce qu'autoriser "xs:choice" dans "xs:all" conduit rapidement à
autoriser des contenus dit "non déterministes" dans lesquels un
processeur de schéma ne pourrait pas déterminer où il est dans le schéma
sans avoir à faire des "va et viens" dans le document source et que le
groupe de travail W3C XML Schema a décidé d'interdire les schémas non
déterministes.
J'ai écrit tout un chapitre dans mon livre RELAX NG pour couvrir ce
point : http://books.xmlschemata.org/relaxng/RngBookAssignment.html
> <xs:element name="root
> <xs:complexType>
> <xs:sequence>
> <xs:element name="elem1" type="xsd:String"/>
> <xs:element name="elem2" type="xsd:String"/>
> <xs:choice>
> <xs:element name="elem3" type="xs:String"/>
> <xs:element name="elem4" type="xs:String"/>
> </xs:choice>
> </xs:sequence>
> </xs:complexType>
> </xs:element>
>
> Fonctionne mais impose que les elements soient dans l'ordre indiqué.
Oui.
> Quelle est la solution ?
Changer de langage de schéma et utiliser RELAX NG qui n'a pas cette
limitation ;-) ...
Si vous êtes contraint et forcé d'utiliser W3C XML Schema, il vous
faudra chercher à contourner cela et choisir entre :
* imposer un ordre même si vous n'en avez pas besoin
* accepter de ne relâcher vos contraintes et écrire :
<xs:element name="root
<xs:complexType>
<xs:all>
<xs:element name="elem1" type="xsd:String"/>
<xs:element name="elem2" type="xsd:String"/>
<xs:element name="elem3" type="xs:String"
minOccurs="0"/>
<xs:element name="elem4" type="xs:String"
minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
dans ce cas on peut bricoler avec xs:key pour générer une erreur lorsque
elem3 et elem4 sont présents simultanément ou absents tous les deux,
mais cela utilise un point de la recommandation qui est sujet à
discussion et ne marche pas avec toutes les implémentations de W3C XML
Schema.
* rajouter un "conteneur" :
<xs:element name="root
<xs:complexType>
<xs:all>
<xs:element name="elem1" type="xsd:String"/>
<xs:element name="elem2" type="xsd:String"/>
<xs:element name="conteneur">
<xs:complexType>
<xs:choice>
<xs:element name="elem3" type="xs:String"/>
<xs:element name="elem4" type="xs:String"/>
</xsl:choice>
</xs:complexType>
</xs:complexType>
</xs:all>
</xs:complexType>
</xs:element>
* autre ???
Cordialement,
Eric van, der Vlist
>
>
--
Freelance consulting and training.
http://dyomedea.com/english/
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(ISO) RELAX NG ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Received on Tue Dec 14 12:23:45 2004