2014-01-31 65 views
0

我有以下XML模式。如何定義XML模式次數指示符(發生中的所有元素或根本不發生)

我可以限制最大和上發生最小限制,但我怎樣可以定義F1應發生在該領域中的所有元素或不應該出現在所有限制。

任何幫助,將不勝感激。

<xs:element name="fields"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="field" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="name" type="xs:string" /> 
         <xs:element name="f1" type="xs:integer" minOccurs="0" /> 
         <xs:element name="f2" type="xs:integer" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
+1

難道我的回答可以幫助您? –

+0

@Erwin是的。謝謝 – MAK

回答

1

經過一番思考,我想我現在明白你的意思了。你不想在<field>子元素的全部或沒有發生像F1我想,但你想要一個水平:要在一個<fields>父所有<field>元素要麼有一個<f1>孩子,或者沒有。在xml模式1.0和xml模式1.1中,只有使用xpath-assertion時,這仍然不可行。它也是而不是這是一種用xml模式規範使用的類型概念進行建模的自然方式。

但是,如果您在<fields>父級中創建不同類型的字段,則可以很容易地建模,例如。假設你有分配「這都需要有一個'子元素」一個複雜類型,並分配給一個元素<field>不能有這樣的孩子在所有另一個複雜類型。然後,您可以輕鬆地說,使用該<xs:choice><fields>所有兒童應爲<f1field>或`」。

模式

<xs:element name="fields"> 
    <xs:complexType> 
     <xs:choice> 
      <xs:element name="field" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="name" type="xs:string" /> 
         <xs:element name="f2" type="xs:integer" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="f1field" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="name" type="xs:string" /> 
         <xs:element name="f1" type="xs:integer" /> 
         <xs:element name="f2" type="xs:integer" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:choice> 
    </xs:complexType> 
</xs:element> 

XML

<fields> 
    <f1field> 
     <name>x</name> 
     <f1>3</f1> 
     <f2>2</f2> 
    </f1field> 
    <f1field> 
     <name>x</name> 
     <f1>3</f1> 
     <f2>2</f2> 
    </f1field> 
    <!-- Next field will be rejected by validator because there are 
     already f1field elements --> 
    <field> 
     <name>df</name> 
     <f2>5</f2> 
    </field> 
</fields>