要求任何元素序列中的特定元素

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>

解释:

一个必需的元素,在元素内:

我尝试使用choiceall等,但没有找到任何解决方案。

来自 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>