1

我正在尝试定义一个具有可选标记的 XML 模式,sort_expression. 如果提供了该可选标签,alternate_sort_expression则允许第二个可选标签,但条件是第一个标签的存在。

例如,我希望这些示例验证:

<indication>
    <label>A label for the item</label>
    <sort_expression>Some Value</sort_expression>
    <!-- one sort expression was provided -->
</indication>

或者

<indication>
    <label>A label for the item</label>
    <!-- no sort expression was provided -->
</indication>

或者

<indication>
    <label>A label for the item</label>
    <sort_expression>Some Value</sort_expression>
    <alternate_sort_expression>Some Value</alternate_sort_expression>
</indication>

但以下内容不应通过验证:

<indication>
    <label>A label for the item</label>
    <!-- no main sort expression was provided -->
    <alternate_sort_expression>INVALID</alternate_sort_expression>
</indication>

我认为下面的模式,使用两个序列的选择会起作用。不幸的是,模式本身没有验证;Altova XML Spy 告诉我“复杂类型指示的内容模型是模棱两可的:

<xs:complexType name="indication">
<xs:sequence>
  <xs:element name="label" type="xs:string"/>
  <xs:choice>
    <xs:sequence>
      <xs:element name="sort_expression" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:sequence>
      <xs:element name="sort_expression" type="xs:string"/>
      <xs:element name="alternate_sort_expression" type="xs:string" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:choice>
</xs:sequence>

4

2 回答 2

4

创建一个包含强制<sort_expression>元素和可选<alternate_sort_expression>元素的可选序列。

因为它们在相同的序列中,<alternate_sort_expression>只在出现时<sort_expression>出现,但也<sort_expression>可以省略,因为整个序列可以省略。

<xs:complexType name="indication">
  <xs:sequence>
    <xs:element name="label" type="xs:string"/>
    <xs:sequence minOccurs="0">
      <xs:element name="sort_expression" type="xs:string"/>
      <xs:element name="alternate_sort_expression" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
    </xs:sequence>
  </xs:sequence>
</xs:complexType>
于 2011-07-08T20:16:31.130 回答
1

使用嵌套序列可以做到这一点:

<xs:complexType>
    <xs:sequence>
        <xs:element name="label" type="xs:string" />
        <xs:sequence minOccurs="0" maxOccurs="1">
            <xs:element name="sort_expression" type="xs:string" />
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
                <xs:element name="alternate_sort_expression" type="xs:string" />
            </xs:sequence>
        </xs:sequence>
    </xs:sequence>
</xs:complexType>

...至少它可以根据需要验证您的示例。

于 2011-07-08T14:33:56.197 回答