2012-06-15 61 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>