XSD tout élément un ordre quelconque un nombre quelconque de fois
-
02-10-2019 - |
Question
J'ai essayé tous les <xs:all>, <xs:choice>, and <xs:sequence>
Aucune de ces aide mon cas de manière satisfaisante.
Quelqu'un sait comment voulez-vous valider quelque chose comme ça.
<Menu>
<SubMenu>
<MenuItem .. />
<MenuItem .. />
<MenuItem .. />
</SubMenu>
<MenuItem .. >
<MenuItem .. >
</Menu>
Où,
Sous l'étiquette <Menu>
<SubMenu>
et / ou <MenuItem>
peut se produire un certain nombre de fois (0-n) dans un ordre quelconque.
Mais au moins l'un d'entre eux doit se produire au moins une fois.
Ignorer les balises à l'intérieur des validations sous-menus.
apprécieraient toute aide dans cette affaire.
La solution
Si je comprends bien vos besoins alors vous pourriez phrase le modèle comme « l'un des sous-menus ou MenuItem suivie par zéro ou plusieurs éléments sous-menus ou MenuItem ». Cela peut être exprimé assez facilement comme une séquence de deux choix:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- whatever your element needs to be modelled as here -->
<xs:element name="MenuItem">
<xs:complexType>
<xs:attribute name="text"/>
</xs:complexType>
</xs:element>
<!-- only modelling the structure of the child elements here -->
<xs:element name="SubMenu">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Menu">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Vous pouvez modéliser cette plus proprement en utilisant un type global partagé pour accéder au Menu et sous-menus mais cette manière est relativement évidente je espère.