XSD:基于元素条件的选择

时间:2015-05-11 17:20:49

标签: xml xsd .net-4.0

我试图为这种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嵌套可能会更好地使用自定义类型。如果需要,我可以自定义,只是让我知道它是否真的需要一个解决方案,我会)。

1 个答案:

答案 0 :(得分:2)

  

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

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

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

  

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

... Microsoft不支持XSD 1.1。您可以考虑使用Saxon for .NET。

如果您无法切换到支持XSD 1.1的Saxon或其他环境,请放宽验证限制或提供不同版本的valid个不同的名称以反映其不同的类型。