Est-il possible, dans le langage XSD (XML Schema Language) du W3C, d'autoriser une série d'éléments dans n'importe quel ordre, tout en limitant le nombre d'occurrences?

StackOverflow https://stackoverflow.com/questions/104248

  •  01-07-2019
  •  | 
  •  

Question

Je connais all et choice, mais ils ne prennent pas en compte le cas où je souhaite que certains éléments puissent se produire plusieurs fois, tels que:

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

Je pourrais utiliser sequence, mais je préférerais que ces enfants soient dans n'importe quel ordre. Je pourrais utiliser any, mais je ne pourrais pas avoir plus d’un ThingC. Je pouvais utiliser ThingA, mais je ne pouvais pas alors limiter ThingB et <=> à 0 ou 1.

Je pense avoir lu quelque part que c'était soit difficile soit impossible sous XSD, mais que cela pourrait être possible avec RELAX NG. Je ne me souviens pas où j'ai lu cela, malheureusement.

Merci pour toute aide!

Était-ce utile?

La solution

C'est vrai: vous ne pouvez pas faire ce que vous voulez dans XML Schema, mais vous pouvez dans 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 dans le schéma XML sont les suivantes:

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

Il s’avère que le troisième est généralement la meilleure option; Généralement, les générateurs XML ne génèrent pas beaucoup de coûts pour générer des éléments dans un ordre donné. Cela facilite non seulement la validation, mais facilite également la consommation du code XML si l'ordre peut être connu à l'avance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top