我尝试了所有 <xs:all>, <xs:choice>, and <xs:sequence>

这些都不令人满意地帮助我的案子。

有人知道您将如何验证这样的事情吗?

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

在哪里,在 <Menu> 标签 <SubMenu> 和/或 <MenuItem> 可以按任何顺序发生任何数量(0-N)。但是其中至少一个必须至少发生一次。

忽略子菜单中的验证。

在此问题上都将感谢任何帮助。

有帮助吗?

解决方案

如果我正确理解了您的要求,那么您可以将模型称为“子菜单或menuitem之一,然后是零或更多的子菜单或menuitem元素”。可以很容易地作为两个选择的顺序表达:

<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