XSD любой элемент любой заказать любое количество раз
-
02-10-2019 - |
Вопрос
Я пробовал все <xs:all>, <xs:choice>, and <xs:sequence>
Никто из них не помогает моему делу удовлетворительно.
Кто-нибудь знает, как бы вы проверили что-то вроде этого.
<Menu>
<SubMenu>
<MenuItem .. />
<MenuItem .. />
<MenuItem .. />
</SubMenu>
<MenuItem .. >
<MenuItem .. >
</Menu>
Где, под <Menu>
ярлык <SubMenu>
и / или <MenuItem>
может произойти любое количество раз (0-N) в любом порядке. Но хотя бы один из них должен произойти по крайней мере один раз.
Игнорирование проверки внутри тегов подменю.
Будет признателен за любую помощь в этом вопросе.
Решение
Если я правильно понял ваше требование, вы можете сбрать модель как «один из подменю или меню, а затем ноль или более подменю или элементы меню». Это можно выразить довольно легко, как последовательность двух вариантов:
<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>
Вы можете моделировать это более чисто, используя общий глобальный тип для меню и подменю, но этот путь относительно очевиден, я надеюсь.