我想创建一个像这样的 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>
说明:
元素 a 必需,位于元素内部:
- 任意元素 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 实际上试图表明,只要至少有一个 b
元素,a
就可以具有任意子元素序列。
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>
关于xml - 需要任意元素序列中的特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32090194/