4

我有如下的xml

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

如图所示,可以有 n 个术语和 n-1 个 Ands (n > 0)。我尝试了以下 xml 架构,但上面的 xml 无法针对架构进行验证。 错误:cvc-complex-type.2.4.b:元素“搜索”的内容不完整。需要“{And}”之一。

<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 架构的任何帮助。

4

2 回答 2

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>
于 2012-06-16T02:00:47.170 回答
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>
于 2012-08-21T02:05:39.653 回答