2011-03-07 28 views
27

我无法理解下面的XML架构的行为:理解XSD:选择的minOccurs

<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 

如果我改变元素e2minOccurs属性比其他"0"东西,我得到我最初的预期行为。

  • 它好像元素的单纯没有<e2>数为xsd:choice的在我的例子发生。

  • 如果是这种情况,那么如何发生这种无限次数的事件并不违反我的xsd:choice中的maxOccurs限制?

回答

81

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

这是完全可能的,你会选择去商店两次,并在每次没有购买橙子。所以你没有回来。

+0

@ mizo写道(在我删除的答案中):我画了一个这样的决策树,并得出结论,这个选择可能导致十一个不同的序列。如果我决定“去购物”一次,我可以用e1,e1 e1,nothing或e2结束。如果我决定“购物”两次,我可以结束以前的四种排列或e1 e1 e1,e1 e2,e1 e1 e1 e1,e1 e1 e2,e2 e1,e2 e1 e1或e2 e2中的任何一个。它是否正确? - mizo 6小时前 – 2011-03-08 02:16:35

+11

这就是我吃香蕉的原因:香蕉树中的分支较少。 – Dan 2013-05-15 04:06:08

+1

最佳答案我已阅读过一段时间:清晰,简洁,让你在这个过程中微笑。荣誉。 – tsemer 2016-03-03 15:37:05

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 

注意,选择[分钟= 2最大= 2]将产生一组相同的有效组合。

+0

好的,如果你删除重复的'e1e1',那么这个数字就是11。果然,如果其中一个子元素具有'minOccurs =“0”',那么'choice'上的'minOccurs'似乎不起作用。 – mizo 2011-03-08 13:35:23

+0

对,11种独特的可能性。请注意,minOccurs =“1”是默认值,因此删除该属性不会更改minOccurs值。即使你设置了minOccurs = 2,这组有效的连击也不应该改变。只要其中一个有效选项具有minOccurs = 0,我就可以得出结论:minOccurs = maxOccurs所在的选项属性会产生与minOccurs 2011-03-08 20:08:58