2008-09-19 12 views
2

Je sais à propos all et choice, mais ils ne représentent pas un cas où je ne veux certains éléments pour pouvoir produire plus d'une fois, comme:Est-il possible dans le langage XML Schema (XSD) du W3C de permettre à une série d'éléments d'être dans n'importe quel ordre mais de limiter les occurrences?

<Root> 
    <ThingA/> 
    <ThingB/> 
    <ThingC/> 
    <ThingC/> 
    <ThingC/> 
</Root> 

je pourrais utiliser sequence, mais je Je préfère laisser ces enfants dans n'importe quel ordre. Je pourrais utiliser any, mais je ne pouvais pas avoir plus d'un ThingC. Je pourrais utiliser choice, mais je ne pouvais pas limiter ThingA et ThingB-0 ou 1.

Je pense que je l'ai lu quelque part que cela était difficile, voire impossible dans XSD, mais peut-être possible avec RELAX NG. Je ne me souviens pas où j'ai lu ça, malheureusement.

Merci pour toute aide!

Répondre

6

C'est vrai: vous ne pouvez pas faire ce que vous voulez faire dans le schéma XML, mais vous pouvez en RELAX NG avec:

<element name="Root"> 
    <interleave> 
    <element name="ThingA"><empty /></element> 
    <element name="ThingB"><empty /></element> 
    <oneOrMore><element name="ThingC"><empty /></element></oneOrMore> 
    </interleave> 
</element> 

Vos options XML Schema sont:

  • ajoutez une étape de prétraitement qui normalise votre code XML d'entrée dans un ordre particulier, puis utilisez <xs:sequence>
  • utilisez <xs:choice> et ajoutez une validation supplémentaire (par exemple, en utilisant Schemat ron) pour vérifier qu'il n'y a pas plus d'un ou <ThingA><ThingB>
  • décident de fixer l'ordre des éléments dans votre langage de balisage

Il se trouve que le troisième est généralement la meilleure option; Les générateurs de XML ne génèrent généralement pas beaucoup de coûts pour produire des éléments dans un ordre particulier, et non seulement ils aident à la validation, mais ils facilitent également la consommation du XML si la commande peut être connue à l'avance.

+0

Merci pour l'excellente réponse, je l'apprécie vraiment! –