Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSD:基于元素条件的选择_Xml_Xsd_.net 4.0 - Fatal编程技术网

Xml XSD:基于元素条件的选择

Xml XSD:基于元素条件的选择,xml,xsd,.net-4.0,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> </val

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

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

在XSD 1.0中,不能让相同的命名同级元素具有不同的类型

您可以在XSD1.1中使用条件类型赋值来完成此操作,除了

如何在.NET4.x支持的XSD中实现这一点

…Microsoft不支持XSD 1.1。您可以考虑使用SAXON来代替.NET。


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

谢谢。如果我们可以切换到Saxon for.NET呢?XSD1.1解决方案会变得一团糟吗?不,Saxon将启用XSD1.1,它比XSD1.0更具表现力;请参阅
xs:assertion
和条件类型分配(
xs:alternative
)。但是,如果可能的话,考虑重命名不同的<代码>有效< /代码>元素,避免对高级XSD 1.1设施的需要;这并不是为了避免“混乱”,而是为了遵循一种通用的XML命名最佳实践,即不同元素的命名不同。“最佳实践”是我要找的词。谢谢我现在已经完全重新设计了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>