在 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>這樣的文件則無法驗證,因為第二個<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。