理解xsd:choice和minOccurs

时间:2011-03-07 00:26:49

标签: xml xsd

我无法理解以下XML架构的行为:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="rootnode">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:choice minOccurs="1" maxOccurs="2">
          <xsd:element name="e1" minOccurs="1" maxOccurs="2"/>
          <xsd:element name="e2" minOccurs="0" maxOccurs="1"/>
        </xsd:choice>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

我预计<e1>的子项中至少需要一个元素<e2><rootnode>的实例。尽管我的期望,空<rootnode>将验证此架构:

 > xmllint --schema test.xsd empty.xml
 <?xml version="1.0" encoding="UTF-8"?>
 <rootnode>
 </rootnode>
 empty.xml validates

如果我将元素minOccurs的{​​{1}}属性更改为e2以外的其他属性,我会得到我原先预期的行为。

  • 好像仅仅缺席元素"0"计算为我示例中<e2>的出现。

  • 如果是这种情况,那么为什么这无限次的出现次数不会违反xsd:choice中的maxOccurs限制?

2 个答案:

答案 0 :(得分:94)

我告诉你,你可以去商店至少一次,最多两次,每次你可以选择买什么:你可以买苹果(一个苹果或两个苹果),或者你可以买橙子(无橙子或橙子)。

你完全有可能选择去商店两次,每次都不买橙子。所以你什么也没回来。

答案 1 :(得分:1)

以下是允许的组合

Two choices:
e1 (1 - 2) + e1 (1 - 2) = e1 x (2 - 4), or
e1 (1 - 2) + e2 (0 - 1), or 
e2 (0 - 1) + e1 (1 - 2), or
e2 (0 - 1) + e2 (0 - 1) = e2 (0 - 2)

One choice (but no new outcomes):
e1 (1-2), or
e2 (0-1)


e1e1, e1e1e1, e1e1e1e1
e1, e1e2, e1e1e2 
e2e1, e2e1e1 
empty, e2, e2e2 

请注意,选择[min = 2 max = 2]会产生相同的有效组合。