XSD любой элемент любой заказать любое количество раз

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

  •  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>

Вы можете моделировать это более чисто, используя общий глобальный тип для меню и подменю, но этот путь относительно очевиден, я надеюсь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top