在 XSD 中,复杂内容模型受唯一粒子归属(UPA)约束规则的约束。 此规则要求实例文档中的每个元素明确对应于其父内容模型中的一个 <xsd:element> 或 <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>这样的文档,因为不清楚第二<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/>的情况下无法确定<xsd:element>所对应的<e1/>,内容模型违反了 UPA 约束规则。
查找详细信息
以下文档由万维网联合会(W3C)发布,其中包含唯一粒子归属约束的技术说明:
“XML 模式第 1 部分:结构第二版,W3C 提出的编辑推荐”
第 3.8.6 节:模型组架构组件的约束
附录 H:对唯一粒子归因约束的分析(非规范性)
若要查看文档,请访问 http://www.w3.org/TR/xmlschema-1。