代码之家  ›  专栏  ›  技术社区  ›  Robin Maben

XSD任意元素任意顺序任意次数

  •  3
  • Robin Maben  · 技术社区  · 14 年前

    我试过所有的方法 <xs:all>, <xs:choice>, and <xs:sequence>

    <Menu>  
       <SubMenu>
          <MenuItem .. />  
          <MenuItem .. />  
          <MenuItem .. />  
       </SubMenu>  
       <MenuItem .. >  
       <MenuItem .. >  
    </Menu>
    

    哪里, 在 <Menu> 标签 <SubMenu> 和/或 <MenuItem> 可以以任何顺序出现任意次数(0-n)。

    在这件事上如有任何帮助,我将不胜感激。

    1 回复  |  直到 14 年前
        1
  •  6
  •   Nic Gibson    14 年前

    如果我正确理解了您的需求,那么您可以将模型表述为“子菜单或菜单项之一,后跟零个或多个子菜单或菜单项元素”。这可以很容易地表示为两个选择的序列:

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

    您可以使用菜单和子菜单的共享全局类型更清晰地对此进行建模,但我希望这种方式相对明显。