xs:choice - 以下节点中的一个且仅一个节点或以下一个或多个节点?

时间:2013-06-06 20:46:05

标签: xml xsd schema

几年前我为我的XML安装程序文件定义了一个XSD。 目标是定义一个需求节点,其子节点具有不同的名称,如:

<requirements>
    <core version="1.0.0.1749" />
    <field version="1.2">chbxgroup</field>
    <php version="5.3"/>
</requirements>

此部分的XSD如下所示:

<xs:element name="requirements" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="core" type="requirement" minOccurs="0" maxOccurs="1" />
            <xs:element name="cms" type="requirement" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="plugin" type="requirement" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="application" type="requirement" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="field" type="requirement" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="php" type="requirement" minOccurs="0" maxOccurs="unbounded" />
        </xs:choice>
    </xs:complexType>
</xs:element>

需求定义:

<xs:complexType name="requirement" mixed="true">
    <xs:attribute name="version" use="optional">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:pattern value="(\d+\.)?(\d+\.)?(\d+)?(\.)?(\d+)?" />
                <xs:whiteSpace value="preserve" />
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="type" use="optional">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:pattern value="function|class" />
                <xs:whiteSpace value="preserve" />
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
</xs:complexType>

如果您愿意,可以在https://xml.sigsiu.net/SobiPro/application.xsd

查看整个定义

现在重要的信息:它完美无缺,完全符合我们的要求

问题在于我们有一个非常好奇和好的用户检查了定义,他正在尝试学习XML和XSD,他向我指出了http://www.w3schools.com/Schema/el_choice.asp的文档,它明确指出你那个“ xs:choice“实际上只允许使用一个已定义的子节点。

我正在检查不同的文档,实际上每一个都是完全相同的。 因此,对于我的理解,我们定义的方式和我所学到的方法不应该真正起作用。 但它确实

一些例子: http://msdn.microsoft.com/en-us/library/ms256109.aspx

  

允许所选内容中包含一个且仅一个元素   组包含在包含元素中。

http://www.w3schools.com/schema/schema_complex_indicators.asp

  

指标指定一个子元素或   另一种情况可能发生:

那么“xs:choice”的真正定义是什么?

它是否真的只允许使用其中一个已定义的元素,或者它只是将下一个子节点的可能选择限制为已定义的元素?

1 个答案:

答案 0 :(得分:0)

行。现在,可以连接点。

<requirements>元素的架构是XML的正确架构。 事实上,所有这些孩子都在xs:choice内定义 可以在任何配置中重复任何次数。

那是因为你有无界 xs:choice

<xs:choice minOccurs="0" maxOccurs="unbounded">

此处,出现属性minOccurs="0" maxOccurs="unbounded"表示 这个xs:choice可以重复任何次数(从0到无限)。 因此,xs:choice中指定的内容可以重复任意次数或相互混合而不受限制。

关于“xs:choice”的含义......是的,xs:choice(即它的单个实例)允许在该选择中定义的那些元素中仅使用一个元素。更准确地说,xs:choice允许您只使用其中定义的一个东西。那些“事物”(称为“粒子”)实际上不仅仅是元素, 还有其他选择,序列,群体。所以,你可以构建相当复杂的限制。