XML Schema:仅在提供另一个可选标记时允许标记

时间:2011-07-08 13:00:19

标签: xml xsd schema-design

我正在尝试定义一个具有可选标记sort_expression的XML模式。如果提供了该可选标记,则允许使用第二个可选标记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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

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