2014-02-07 61 views
3

在W3C RECO(here),我發現XML Schema的xs:ID類型是否對XML元素有效,或者僅對於屬性有效?

[...] ID是類型屬性,所以它不能被應用到的屬性,元件或它們的內容

作爲我能找到一些我必須處理的文件,我不知道如果XSI:ID確實是一個有效的XLM元素類型

我現有的XSD提到:

<xsd:complexType name="customTypeName"> 
<xsd:sequence> 
    <xsd:element name="ID" type="xsd:ID"/> 
    <xsd:element name="myElement" type="string"/> 
</xsd:sequence> 
</xsd:complexType> 

但根據我閱讀,我寧願認爲,有效的聲明而應是

<xsd:complexType name="customTypeName"> 
<xsd:element name="myElement" type="string"/> 
<attribute name="ID" type="xsd:ID" use="required"/> 
</xsd:complexType> 

但可惜的是,我無法改變已經使用XSD ... 我願意使用應用XSLT搜索id()函數。 我應該放棄還是有辦法?

感謝提前對論壇上的第一個問題的任何幫助。

+0

可惜這是你的第一個問題,這是一個很好的(也很棘手),但沒有引起注意。 – Abel

回答

0

好問題,可惜它並沒有在當時得到足夠的重視。)

ID是一個類型的屬性,所以它不能應用於屬性,元素及其內容

這是規範中的一個錯誤。應該說「不能應用於元素或其內容」。在XML Schema 1.1 it is quite clear中,雖然:

對於兼容性,ID只應用於屬性。

這意味着,您可以將類型應用於屬性,但不應用於元素,但通常在執行時不會引發錯誤。

但是,使用xs:ID並不總是有人們所期望的效果。例如,它預計NCName,這意味着它不能以數字開頭。此外,唯一性約束不被強制執行。

使用xml:id通常會好很多。它是well-defined by the spec,它很好的支持你提到的fn:id()函數。此外,使用xml:id,人們不需要學習新名稱,也不需要額外的名稱空間定義。

即使您的XSD驗證程序接受了元素上的xs:ID,XPath規範也不會接受它,並且在使用fn:id()時不會返回它。然而,無論如何,這個函數和element-with-id() function都會返回應用ID的元素,所以不需要太多的問題。

相關問題