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.

Était-ce utile?

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.

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