XSD 全有或全无组

XSD all-or-nothing group

我要匹配这两个文档:

<a>
  <b/>
</a>

和:

<a>
  <b/>
  <c/>
  <d/>
</a>

也就是说,必须既不存在c又不存在d,或者不存在cd

我试过 choice 两个 sequences,但我得到:“内容模型是 不是决定论者。”,我想是因为选择必须在 第一个元素,对于两个不同的文档是相同的。

您可以将 cd 放在 minOccurs=0 的序列组中。像这样:

<element name="a">
  <complexType>
    <sequence>
      <element name="b" />
      <sequence minOccurs="0">
        <element name="c" />
        <element name="d" />
      </sequence>
    </sequence>
  </complexType>
</element>

如果你想让cd能够以任意顺序出现,你可以这样做:

<element name="a">
  <complexType>
    <sequence>
      <element name="b" />
      <choice minOccurs="0">
        <sequence>
          <element name="c" />
          <element name="d" />
        </sequence>
        <sequence>
          <element name="d" />
          <element name="c" />
        </sequence>
      </choice>
    </sequence>
  </complexType>
</element>

显然,如果组中有两个以上的成员,则此方法无法很好地扩展。