2010-09-15 125 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> 

你會這樣更乾淨使用菜單和子菜單共享的全局類型的模式,但這種方式是比較明顯的,我希望。