Comment créer un schéma pour une liste non ordonnée de nœuds XML, avec des contraintes d'occurrence
Donné un XML de mise en page comme cela, je suis en train de créer un schéma XSD pour la valider.
<RootNode>
<ChildA />
<ChildC />
<ChildB />
<ChildB />
<ChildA />
</RootNode>
Les exigences sont les suivantes:
- Enfanta, ChildB et ChildC peut se produire dans n'importe quel ordre. (
<xs:sequence>
inadaptés) - Enfanta est obligatoire mais peut se produire plusieurs fois.
- ChildB est facultatif et peut se produire à plusieurs reprises.
- ChildC est facultatif et peut se produire une seule fois.
La technique que j'utilise habituellement pour créer une liste non ordonnée de nœuds est d'utiliser un <xs:choice maxOccurs="unbounded">
avec chaque nœud dans la liste, cependant, je suis incapable de créer le minOccurs="1"
contrainte sur les Enfanta et la maxOccurs="1"
contrainte sur ChildC. (Le # d'événements de la choix l'emporte sur ceux des éléments ici).
<xs:element name="RootNode">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="ChildA" minOccurs="1"/>
<xs:element name="ChildB" />
<xs:element name="ChildC" maxOccurs="1"/>
</xs:choice>
</xs:complexType>
</xs:element>
source d'informationauteur Mark H
Vous devez vous connecter pour publier un commentaire.
Mise à jour: Dans XSD 1.1 m certaines des contraintes de la
all
-groupes ont été levées. Voir les réponses ici et ici.Pas simple, mais semble faisable. Partie la plus difficile ici est que les définitions de Schéma doit être déterministe. L'approche que j'ai utilisée était de visualiser le problème en dessinant les automates d'états finis et ensuite d'écrire une expression régulière qui correspond que des automates. Il n'est pas aussi compliqué que cela puisse paraître. Encore, en utilisant un autre système de validation serait probablement plus simple de répondre.
J'ai fait quelques tests mais l'absence de certains cas particuliers, c'est facile. S'il vous plaît commentaire si vous repérez une erreur.
...et voici le code:
Cela devrait faire ce que vous avez indiqué:
Je viens de lire les relax-NG raccourci syntaxe.
Je suppose que ce serait condensé de ce qui suit dans le relax-ng compact syntax:
Qui est sûr, c'est joli.