【问题标题】:XML Schema: Permit a tag only if another optional tag is providedXML Schema:仅当提供另一个可选标签时才允许使用标签
【发布时间】:2011-07-09 04:16:31
【问题描述】:

我正在尝试定义具有可选标记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>

【问题讨论】:

    标签: xml xsd schema-design


    【解决方案1】:

    创建一个包含强制&lt;sort_expression&gt; 元素和可选&lt;alternate_sort_expression&gt; 元素的可选序列。

    因为它们的序列相同,所以&lt;alternate_sort_expression&gt; 仅在存在&lt;sort_expression&gt; 时出现,但也可以省略&lt;sort_expression&gt;,因为可以省略整个序列。

    <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>
    

    【讨论】:

      【解决方案2】:

      这可以使用嵌套序列:

      <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>
      

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

      【讨论】:

        猜你喜欢
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 2023-01-04
        • 2021-01-20
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多