唯一粒子归属约束
在 XSD 中,复杂内容模型受唯一粒子归属 (UPA) 约束规则的约束。 此规则要求实例文档中的每个元素明确地完全对应于其父级的内容模型中的一个 <xsd:element>
或 <xsd:any>
粒子。 任何包含具有可能不明确的内容模型的类型的架构都将被拒绝。
产生歧义 <xsd:any>
的最常见原因是通配符和具有可变出现范围(如 minOccurs < maxOccurs)的粒子。 例如,以下内容模型不明确,因为 <e1
> 元素可以匹配 <xsd:element>
或 <xsd:any>
元素。
<xsd:element name="root">
<xsd:complexType>
<xsd:choice>
<xsd:element name="e1"/>
<xsd:any namespace="##any"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
以下内容模型也是不明确的:
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="e1" maxOccurs="2"/>
<xsd:element name="e2" minOccurs="0"/>
<xsd:element name="e1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
虽然可以明确验证像 <root><e1/><e2/><e1/></root>
这样的文档,但无法明确验证像 <root><e1/><e1/></root>
这样的文档,因为不清楚第二个 <xsd:element>
对应于哪一个 <e1/>
。 即使可以明确验证某些文档,此架构也将被拒绝,因为这些文档有可能是不明确的。
请注意,对于有效的内容模型,必须能够在不向下查看的情况下明确验证任何实例。 例如,请思考下面的内容模型:
<xsd:element name="root">
<xsd:complexType>
<xsd:choice>
<xsd:sequence>
<xsd:element name="e1"/>
<xsd:element name="e2"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element name="e1"/>
<xsd:element name="e3"/>
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
</xsd:element>
对于像 <root><e1/><e3/></root>
这样的文档,序列 <e1/><e3/>
明确与第二个 <xsd:sequence>
匹配。 但是,由于在不向下查看 <xsd:element>
情况下无法确定 <e1/>
所对应的 <e3/>
,因此该内容模型违反了 UPA 约束规则。
查找详细信息
以下文档由 World Wide Web 联合会 (W3C) 发布,其中包含唯一粒子归属约束的技术说明:
“XML 架构第 1 部分:结构第二版 - W3C 已修正的提议推荐”:
第 3.8.6 节:模型组架构组件的相关约束
附录 H:唯一粒子归属约束(非标准)的分析
若要查看该文档,请访问 http://www.w3.org/TR/xmlschema-1。