这是XSD Schema的限制。我将引用自:http://www.w3.org/TR/2001/REC-xmlschema-0-20010502/然后评论:
存在着对一组约束元素第三种选择:该组中的所有元素可能出现一次或根本没有,他们可以以任何顺序出现。所有组(提供SGML &连接器的简化版本)仅限于任何内容模型的顶层。此外,该小组的所有孩子都必须是单个元素(无组),并且内容模型中没有元素可能会出现超过一次,即minOccurs和maxOccurs的允许值分别为0和1.例如,要允许子元素purchaseOrder的出现在任何顺序,我们可以重新定义PurchaseOrderType为: 的“所有”组
<xsd:complexType name="PurchaseOrderType">
<xsd:all>
<xsd:element name="shipTo" type="USAddress"/>
<xsd:element name="billTo" type="USAddress"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="items" type="Items"/>
</xsd:all>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
根据这一定义,一个comment元素可以选择地出现内purchaseOrder中,它可能之前或任何SHIPTO,收单方后出现和项目元素,但它只能出现一次。此外,所有团体的规定都不允许我们在团体之外宣布诸如评论之类的要素,作为使其不止一次出现的手段。 XML模式规定所有组必须作为内容模型顶部的唯一子项出现。换句话说,下面是非法的: 用非法的例子“所有”集团
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:all>
<xsd:element name="shipTo" type="USAddress"/>
<xsd:element name="billTo" type="USAddress"/>
<xsd:element name="items" type="Items"/>
</xsd:all>
<xsd:sequence>
<xsd:element ref="comment" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
我在当时的讨论中回忆了那个xsd:all
将是过于复杂的模型,如果它是比这更少受限制。它很快扩展到非确定性解析模型。所以限制是0或1,并且没有兄弟姐妹。
SGML有一个使用&
连接器的更强大的模型,但并不是所有的系统都实现了它。
编辑如果你想在这个水平,你可以使用的Schematron作为模式之后的第二次验证验证XML。它基于XSLT,这种约束更容易表达。
正确。这个内容模型可以通过分解FILM元素来简化,所以你有一个外部序列,其中包含一个选择,然后是对'FILM'的引用。 – 2012-08-21 01:56:56