XSD任何元素的任何元素任意次数

时间:2010-09-15 09:44:19

标签: xml xsd xsd-validation

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

这些都不能令我满意。

有人知道你会如何验证这样的东西。

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

其中, 在<Menu>标记下  <SubMenu>和/或<MenuItem>可以按任何顺序出现任意次数(0-n)。  但至少其中一个必须至少发生一次。

忽略SubMenu标记内的验证。

对此事的任何帮助表示感谢。

1 个答案:

答案 0 :(得分:6)

如果我已正确理解您的要求,那么您可以将模型短语称为“SubMenu或MenuItem之一,后跟零个或多个SubMenu或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>

你可以使用Menu和SubMenu的共享全局类型更干净地建模,但我希望这种方式相对明显。