您当前的模型定义了 (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>