0

几年前,我为我的 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”的真正定义是什么?

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

4

1 回答 1

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允许您只使用其中定义的那些东西中的一种。这些“事物”(称为“粒子”)实际上不仅可以是元素,还可以是其他选择、序列、组。所以,你可以用所有这些来构建相当复杂的限制。

于 2013-06-06T23:28:00.833 回答