我试图为这种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:choice
以a
的值为条件,因为下面的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嵌套可能会更好地使用自定义类型。如果需要,我可以自定义,只是让我知道它是否真的需要一个解决方案,我会)。
答案 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
个不同的名称以反映其不同的类型。