XML 架构 - 选择元素内的 maxOccurs

2024-03-28

我有以下架构声明:

<element name="container">
  <complexType>
    <choice minOccurs="0" maxOccurs="unbounded">
      <element name="action" minOccurs="0" maxOccurs="1" />
      <element name="query" minOccurs="0" maxOccurs="unbounded" />
      <element name="validator" minOccurs="0" maxOccurs="unbounded" />
    </choice>
  </complexType>
</element>

我基本上想要一个<container>包括尽可能多的<query> or <validator>所需的元素,但只有一个<action>元素(也可能没有)。

据我所知,我不能将 maxOccurs 放在<choice>因为从技术上讲,该选择可以无限次地进行(由于查询和验证器上没有限制)。

然而,这个 XML 在 Eclipse 中被认为是有效的(这很可能是 Eclipse 验证中的一个问题,尽管所有其他位都工作正常)

<container>
  <action id="action1" name="action1" />
  <action id="action2" name="action2" />
  <query id="query1" />
  <validator id="testValidator" />
</container>

不确定我是否遗漏了一些明显的东西。


您当前的模型定义了 (a) 之一中的选择action元素或无,(b) 零个或多个query元素,或 (c) 零个或多个validator元素,然后允许该选择重复零次或多次。因此它相当于

<choice minOccurs="0" maxOccurs="unbounded">
  <element name="action"/>
  <element name="query"/>
  <element name="validator"/>
</choice>

它允许任何零个或多个元素的序列,其中每个元素都是一个action, a query, or a validator元素。

您制定的要求可以通过使用来满足sequence代替choice:

<sequence>
  <element name="action" minOccurs="0" maxOccurs="1" />
  <element name="query" minOccurs="0" maxOccurs="unbounded" />
  <element name="validator" minOccurs="0" maxOccurs="unbounded" />
</sequence>

有时,不同种类的元素出现的顺序传达了信息,因此有必要允许它们混合在一起。在这种情况下,该问题类似于以下正则表达式问题:编写一个正则表达式,定义由“a”、“q”和“v”组成的字符串集,其中“a”最多出现一次。一个明显的正则表达式是(q|v)*(a(q|v)?)。类似的 XSD 模型组是:

<sequence>
  <choice minOccurs="0" maxOccurs="unbounded">
    <element ref="query"/>
    <element ref="validator"/>
  </choice>
  <sequence minOccurs="0">
    <element name="action"/>
    <choice minOccurs="0" maxOccurs="unbounded">
      <element ref="query"/>
      <element ref="validator"/>
    </choice>
  </sequence>
</sequence>

(我已从本地元素声明更改为元素引用,以避免必须声明query and validator各两次。)

在 XSD 1.1 中,应该可以使用all group:

<all>
  <element name="action" minOccurs="0" maxOccurs="1" />
  <element name="query" minOccurs="0" maxOccurs="unbounded" />
  <element name="validator" minOccurs="0" maxOccurs="unbounded" />
</all>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XML 架构 - 选择元素内的 maxOccurs 的相关文章

随机推荐