2010-09-15 86 views
3

我曾尝试<xs:all>, <xs:choice>, and <xs:sequence>XSD任何元素顺序

这些都不所有任意次数,帮助我的情况令人满意。

有谁知道你会如何验证这样的事情。

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

凡 根据<Menu>标签 <SubMenu>和/或<MenuItem>可发生任意数量的以任意顺序时间(0-N)。 但其中至少有一个必须至少发生一次。

忽略SubMenu标签中的验证。

希望在这个问题上的任何帮助。

+0

到目前为止您已经管理的模式的相关位将使它更容易帮助您 – 2010-09-15 12:31:00

+0

还请添加您希望能够使用您的模式定义的结构的示例XML(目标文档) – jasso 2010-09-15 17:37:33

+0

Hope这有助于。 – 2010-09-16 13:15:40

回答

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> 

你会这样更干净使用菜单和子菜单共享的全局类型的模式,但这种方式是比较明显的,我希望。