【问题标题】:Understanding xsd:choice and minOccurs了解 xsd:choice 和 minOccurs
【发布时间】:2011-03-07 00:26:48
【问题描述】:

我无法理解以下 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>

我预计至少需要一个元素 &lt;e1&gt;&lt;e2&gt; 的实例作为 &lt;rootnode&gt; 的子元素。尽管我的期望是空的 &lt;rootnode&gt; 将针对此架构进行验证:

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

如果我将元素 e2minOccurs 属性更改为 "0" 以外的其他值,我会得到我最初预期的行为。

  • 在我的示例中,元素&lt;e2&gt;不存在 似乎算作xsd:choice 的出现。

  • 如果是这种情况,那么这个无限的出现次数怎么没有违反我的xsd:choice 中的maxOccurs 限制?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

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

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

    【讨论】:

    • @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 小时前
    • 这就是我吃香蕉的原因:香蕉树的树枝少了。
    • 我在 SO 上读过的最佳答案:清晰、简洁,让您在此过程中微笑。荣誉。
    【解决方案2】:

    以下是允许的组合

    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 
    

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

    【讨论】:

    • 好的,如果您删除重复的 e1e1,则算作 11 个。果然,choice 上的minOccurs 似乎没有效果,如果其中一个子元素有minOccurs="0"
    • 对,11 种独特的可能性。请注意 minOccurs="1" 是默认值,因此删除该属性不会更改 minOccurs 值。即使您设置了 minOccurs=2,有效组合的集合也不应该改变。只要其中一个有效选项的 minOccurs=0,我就得出结论,选择属性 where minOccurs = maxOccurs 产生的集合与 where minOccurs 相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多