2012-06-18 178 views
2

應如何解釋XML名稱空間規範中的以下內容?默認名稱空間中的XML屬性名稱和元素?

默認名稱空間聲明適用於其範圍內的所有無前綴的元素名稱。默認名稱空間聲明不直接應用於屬性名稱;前綴屬性的解釋是由它們出現的元素決定的。

我的直覺上的理解是,前綴無關的屬性應該被解釋爲屬於它們所屬元素的名稱空間。但是,下面的例子似乎證明了這種虛假的:

模式:

<xs:schema xmlns:myns="http://test.com/xsd/foo" elementFormDefault="qualified" 
      targetNamespace="http://test.com/xsd/foo" version="1.0" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:attribute name="Id" type="xs:string" /> 
    <xs:element name="Foo"> 
     <xs:complexType> 
      <xs:attribute ref="myns:Id" /> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

的例子,通過驗證:

<a:Foo xmlns:a="http://test.com/xsd/foo" a:Id="123" /> 

實例驗證失敗:

<Foo xmlns="http://test.com/xsd/foo" Id="123" /> 

是什麼給了?

回答

2

這裏有兩個獨立的問題。第一個關於XML,第二個關於XML Schema(XSD)。

在XML中(具體而言,如XML名稱空間建議中所定義的),前綴不固定的屬性不在名稱空間中。一些評論員將此解釋爲命名空間是未定義的(即應用程序定義的),但通常的和更簡單的解釋是它是空的:沒有命名空間。如果您在這種情況下要求命名空間URI,大多數API規範將返回null,其中一些將返回零長度的字符串。

在XSD中,全局屬性聲明定義在其被聲明,或在沒有命名空間,如果包含架構文檔指定沒有目標命名空間中的XML模式文檔的目標命名空間的屬性。出於這個原因,它是不尋常的使用全局屬性聲明。一種常用技術是聲明屬性組(有時,屬性包含單個屬性組);這樣的屬性組中聲明的任何屬性是本地聲明,而不是全局聲明,所以除非你說attributeFormDefault =「合格」,這是做一個相當奇怪的事情,他們不繼承含模式文檔的目標命名空間。

0

由於模式中的屬性具有名稱空間,所以屬性Id在任何名稱空間外解釋並且與模式不匹配。但是,如果模式聲明不同,具體如下:

<xs:schema xmlns:myns="http://test.com/xsd/foo" elementFormDefault="qualified" targetNamespace="http://test.com/xsd/foo" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Foo"> 
     <xs:complexType> 
      <xs:attribute name="Id" type="xs:string" /> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

先前無效文檔驗證,反之亦然。原因似乎是XML Schema定義了一個屬性的名稱空間是由其父親<schema>元素的targetNamespace屬性定義的,或者如果沒有,則不存在目標名稱空間。在後一種情況下,父項是<complexType>而不是<schema>,所以該屬性不會獲得名稱空間。

但是,關於在我原來的問題中解釋前綴不確定屬性的說明仍令人費解。

0

看看詳細的答案,我前面張貼了類似的問題:

What is the behavior of getAttributeNS?

屬性沒有命名空間,除非有一個明確的前綴。這個想法是,不同於可以混入其他文檔中的元素,屬性實際上只對攜帶它們的元素的範圍有意義。像xml:lang這樣的例外情況很少,但絕大多數情況下,邏輯上「限定」了(並因此綁定)了其擁有的元素。因此,直到你真的需要一個名稱空間。

相關問題