几年前我为我的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”的真正定义是什么?
它是否真的只允许使用其中一个已定义的元素,或者它只是将下一个子节点的可能选择限制为已定义的元素?
答案 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
允许您只使用其中定义的一个东西。那些“事物”(称为“粒子”)实际上不仅仅是元素,
还有其他选择,序列,群体。所以,你可以构建相当复杂的限制。