XSD:根据元素的条件选择

XSD: choice based on the condition of an element

我正在尝试为这种 XML 想出一个 XSD:

<root>
  <valid>
    <a>1</a>
    <b>foo</b>
    <c>bar</c>
  </valid>
  <valid>
    <a>2</a>
    <c>bar</c>
    <d1>baz</d1>
  </valid>
  <valid>
    <a>3</a>
    <c>bar</c>
    <d2>baz-restricted</d2>
    <e>qux</e>
  </valid>
</root>

在所有名为 valid 的元素中,每个子元素都是必需的。

我知道我需要使 xs:choicea 的值为条件,因为下面的 XSD 在 c 的第二次出现时不明确。

如何在 .NET 4.x 支持的 XSD 中完成此操作?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="valid">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="a" minOccurs="1" maxOccurs="1"/>
              <xs:choice>
                <xs:sequence>
                  <xs:element name="b" minOccurs="1" maxOccurs="1"/>
                  <xs:element name="c" minOccurs="1" maxOccurs="1"/>
                </xs:sequence>
                <xs:sequence>
                  <xs:element name="c" minOccurs="1" maxOccurs="1"/>
                  <xs:element name="d1" minOccurs="1" maxOccurs="1"/>
                </xs:sequence>
                <xs:sequence>
                  <xs:element name="c" minOccurs="1" maxOccurs="1"/>
                  <xs:element name="d2" minOccurs="1" maxOccurs="1"/>
                  <xs:element name="e" minOccurs="1" maxOccurs="1"/>
                </xs:sequence>
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

(我知道 XSD 嵌套使用自定义类型可能会更好。如果需要,我可以自定义它,只要让我知道解决方案是否确实需要它,我会的)。

In all elements named valid, each child-element is mandatory.

在 XSD 1.0 中不能有不同类型的同名兄弟元素。

您可以在 XSD 1.1 中使用条件类型赋值来执行此操作,除了...

How can this be done in the XSD supported by .NET 4.x

...Microsoft 不支持 XSD 1.1。您可能会考虑改用 Saxon for .NET。

如果您无法切换到支持 XSD 1.1 的 Saxon 或其他环境,请放宽您的验证约束或为 valid 的不同版本指定不同的名称以反映其不同的类型。