2011-03-07 30 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