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: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 嵌套使用自定义类型可能会更好。如果需要,我可以自定义它,只要让我知道解决方案是否确实需要它,我会的)。
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
的不同版本指定不同的名称以反映其不同的类型。
我正在尝试为这种 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 嵌套使用自定义类型可能会更好。如果需要,我可以自定义它,只要让我知道解决方案是否确实需要它,我会的)。
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
的不同版本指定不同的名称以反映其不同的类型。