2012-06-15 118 views
4

的序列我有XML如下XML模式重複元素

<Search> 
    <Term /> 
    <And /> 
    <Term /> 
    <And /> 
    <Term /> 
</Search> 

可以有如圖所示的條款n個和在序列中的N-1和S(N> 0)。我嘗試了下面的XML模式,但上面的XML不會得到驗證對模式。 錯誤:cvc-complex-type.2.4.b:元素'搜索'的內容不完整。預計會有'{和}'之一。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Search"> 
     <xs:complexType> 
      <xs:sequence>    
       <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
        <xs:element name="Term" type="xs:string" /> 
        <xs:element name="And" type="xs:string" /> 
       </xs:sequence>    
       <xs:element name="Term" minOccurs="1" maxOccurs="1" type="xs:string" />    
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

欣賞XML模式的任何幫助。

+0

什麼是「和」元素的目的是什麼?你是否像運營商一樣使用它? – Kelly

+0

是的,它是一個操作員。有多種類型的操作符,例如,或不,等等,但我正在使用抽象類型來處理它。 – bluetech

+0

您的XSD無效。它違反了唯一粒子歸因規則。 – toniedzwiedz

回答

9

重新排序他們似乎這樣做。我錯過了什麼?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Search"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Term" minOccurs="1" maxOccurs="1" type="xs:string" /> 
       <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
        <xs:element name="And" type="xs:string" /> 
        <xs:element name="Term" type="xs:string" /> 
       </xs:sequence> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
4

內容模型的修訂形式確實會識別所描述的語言。

但是,您的XML可能更具慣用性,並且如果您根據所需的抽象語法樹思考XML,而不是根據字面的文字轉錄方式來處理,則幾乎肯定會更容易處理語法設計用於令牌序列而不是樹。

而不是在術語之間使用空的And元素,而是將術語的連詞包含在And元素中。

<Search> 
    <And> 
    <Term>...</Term> 
    <Term>...</Term> 
    <Term>...</Term> 
    </And> 
</Search> 

它現在很輕鬆做到任意布爾組合,而不必擔心什麼先後順序來歸於運營商:

<Search> 
    <Or> 
    <And> 
     <Term>...</Term> 
     <Or> 
     <Term>...</Term> 
     <Term>...</Term> 
     </Or> 
    </And> 
    <And> 
     <Term>...</Term> 
     <not><Term>...</Term></not> 
    </And> 
    </Or> 
</Search>