我有一个根元素<a>
及其子<b>, <c>, <d>
这就是我需要的:
<b>
<c>
<d>
例如:
<a>
<c />
<b />
<c />
<d />
</a>
这是我的XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="a">
<xs:complexType>
<xs:choice>
<xs:element name="b" />
<xs:element name="c" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="d" minOccurs="0" maxOccurs="1"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
但minOccurs
中的maxOccurs
和xs:element
可能不起作用。当我运行该示例时,我收到一个错误:
在元素
<b>
下的此位置不允许使用元素<a>
。
我该如何解决这个问题?
答案 0 :(得分:1)
以下是您的XSD所说的内容:在a
内,您可以选择以下选项之一:
b
元素。c
元素。d
元素。您的XML选择选项#2。它没有第二个选择,当解析器遇到b
元素时,它会正确报告违规行为。
您可能认为可以通过授予多种选择来解决此问题:
<xs:choice maxOccurs="unbounded">
现在可以说:在a
内您可以重复选择以下选项之一:
b
元素。c
元素。d
元素。您的XML现在将选择选项#2,然后选择选项#1,然后选择选项#2,然后选择选项#3,然后声明您的XML有效。成功?
不,不是,例如,如果您希望确保只有一个 b
元素子元素,因为重复选择本身,并且可以重复选择选项#1,每次允许单个b
元素,但总的来说,有效地允许多个b
元素。
出于这个原因,xsd:choice
,实际上 XSD 1.0通常不能用于表示您的约束。
您的选项?在XSD以外的代码中检查此约束,或使用XSD 1.1&#39; xsd:assert
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="a">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="b" />
<xs:element name="c"/>
<xs:element name="d"/>
</xs:choice>
<xs:assert test="count(b) = 1 and count(c) > 1 and count(d) >= 0"/>
</xs:complexType>
</xs:element>
</xs:schema>