共用方式為


瞭解唯一物件屬性條件約束

在 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>。然而,因為 <e1/> 所對應的 <xsd:element> 在沒有往前查看 <e3/> 的情況下,即無法做出判斷,所以內容模型違反了 UPA 條件約束規則。

尋找詳細資訊

下列文件是由全球資訊網協會 (W3C) 所發行,其中包含唯一物件屬性條件約束的技術說明:

<XML 結構描述第一部份:結構第二版,W3C 提出的編輯建議>(英文):

  • 第 3.8.6 節:模型群組結構描述元件的條件約束 (Section 3.8.6: Constraints on Model Group Schema Components)

  • 附錄 H:唯一物件屬性條件約束的分析 (非標準的) (Appendix H: Analysis of the Unique Particle Attribution Constraint (non-normative))

若要參閱該文件,請造訪 http://www.w3.org/TR/xmlschema-1.