要求任何元素序列中的特定元素
Require a specific element in a sequence of any elements
我想像这样创建一个 XSD:
<xs:schema>
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="b" minOccurs="1" maxOccurs="unbounded"/>
<xs:any minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
解释:
一个必需的元素,在元素内:
- 任何元素 0 到无穷大次。
- 元素 b 1 到无穷大次。
- 任何元素 0 到无穷大次。
我尝试使用choice
、all
等,但没有找到任何解决方案。
来自 XmlSpy 的错误:
<any...>
makes the content model non-deterministic against <xs:element name="b" ...>
. Possible causes: name equality, overlapping occurrence
or substitution groups.
你的 XSD 实际上是在试图说 a
可以有任何子元素序列,只要至少有一个 b
元素。
XSD 1.0 无法强制执行此类约束,因为任何这样做的尝试(包括您提供的尝试)都会违反唯一粒子原则。
XSD 1.1 可以通过一个简单的断言强制执行这样的约束,声明 b
存在于 a
.
的 xsd:any
个子代中
XSD 1.1
<?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:sequence>
<xs:any processContents="skip" maxOccurs="unbounded"/>
</xs:sequence>
<xs:assert test="b"/>
</xs:complexType>
</xs:element>
</xs:schema>
我想像这样创建一个 XSD:
<xs:schema>
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="b" minOccurs="1" maxOccurs="unbounded"/>
<xs:any minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
解释:
一个必需的元素,在元素内:
- 任何元素 0 到无穷大次。
- 元素 b 1 到无穷大次。
- 任何元素 0 到无穷大次。
我尝试使用choice
、all
等,但没有找到任何解决方案。
来自 XmlSpy 的错误:
<any...>
makes the content model non-deterministic against<xs:element name="b" ...>
. Possible causes: name equality, overlapping occurrence or substitution groups.
你的 XSD 实际上是在试图说 a
可以有任何子元素序列,只要至少有一个 b
元素。
XSD 1.0 无法强制执行此类约束,因为任何这样做的尝试(包括您提供的尝试)都会违反唯一粒子原则。
XSD 1.1 可以通过一个简单的断言强制执行这样的约束,声明 b
存在于 a
.
xsd:any
个子代中
XSD 1.1
<?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:sequence>
<xs:any processContents="skip" maxOccurs="unbounded"/>
</xs:sequence>
<xs:assert test="b"/>
</xs:complexType>
</xs:element>
</xs:schema>