了解唯一粒子归属约束
在 XSD 中,复杂内容模型受唯一粒子归属 (UPA) 约束规则的约束。此规则要求实例文档中的每个元素明确地完全对应于其父级的内容模型中的一个 <xsd:element> 或 <xsd:any> 粒子。任何包含具有可能不明确的内容模型的类型的架构都将被拒绝。
导致不明确的最常见原因是具有可变出现范围(例如 minOccurs < maxOccurs)的 <xsd:any> 通配符字符和粒子。例如,以下内容模型是不明确的,因为 <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> 这样的文档,因为不清楚第二个 <e1/> 对应于哪一个 <xsd:element>。即使可以明确验证某些文档,此架构也将被拒绝,因为这些文档有可能是不明确的。
请注意,对于有效的内容模型,必须能够在不向下查看的情况下明确验证任何实例。例如,请思考下面的内容模型:
<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> 匹配。但是,由于在不向下查看 <e3/> 情况下无法确定 <e1/> 所对应的 <xsd:element>,因此该内容模型违反了 UPA 约束规则。
查找详细信息
以下文档由 World Wide Web 联合会 (W3C) 发布,其中包含唯一粒子归属约束的技术说明:
“XML Schema Part 1: Structures Second Edition, W3C Proposed Edited Recommendation”:
第 3.8.6 节:Constraints on Model Group Schema Components
附录 H:Analysis of the Unique Particle Attribution Constraint (non-normative)
若要查看该文档,请访问 http://www.w3.org/TR/xmlschema-1。