2014-08-28 80 views
0

XML規範指出,非限定名稱空間不在命名空間中。規範中的語義是有爭議的,但是所有的XML工具集都是以這種方式編寫的。請參閱:XML屬性命名衝突解決方案

XML Namespaces and Unprefixed Attributes

這是我的潛意識恨了,我的大腦有意識的鬥爭,以闡述理由的概念。

如果非限定屬性不在任何名稱空間中,那麼驗證如何仍然有效?這是一個矛盾。

當範圍內有兩個同名的屬性會發生什麼。一個來自默認名稱空間,另一個來自當前元素。

<document xmlns="default.ns" xmlns:hr="humanresources.ns"> 
    <hr:user id="abc" /> 
</document> 

如果id在兩個default.ns和humanresources.ns但不同的數據類型定義,說xs:tokenxs:integer其命名空間將被id,如果有一個決心進行驗證?

假設一個驗證器會在模糊性方面出錯,並強制其他屬性被限定,那麼我是否必須編寫一個幫助器GetLocalAttribute方法來處理所有這些?

像:

  • ids =選擇元素上的所有屬性,其中的localName等於id
  • b =從ids其中的名稱空間等於元素名稱空間選擇單個
  • 如果b = NULL {返回b}
  • 否則從ids返回單個名稱空間等於空

盧克

+0

Pedantry警報:您並不是唯一不喜歡指定XML名稱空間的方式,但您的表徵是錯誤的。 XML規範完全沒有提及名稱空間。 XML命名空間規範指出,非限定名稱不會被符合命名空間的軟件認爲屬於任何命名空間 - 它不*表示它們「不在命名空間中」。而且,XML堆棧中的大多數工具都將不合格的名稱視爲與所有其他名稱空間不同的名稱空間。 – 2014-08-28 18:26:39

回答

2

如果id在兩個default.nshumanresources.ns但不同的數據類型定義,說xs:tokenxs:integer其命名空間將ID來,如果有一個決心進行驗證?

它不會「解決」任何事情。你的示例XML

<document xmlns="default.ns" xmlns:hr="humanresources.ns"> 
    <hr:user id="abc" /> 
</document> 

  • 在命名空間default.ns與當地名document根級元素,
  • 在命名空間humanresources.ns與當地名user一個子元素,用
  • 沒有名字空間的本地名稱id的屬性

這是否有效取決於人力資源模式中user元素類型的定義。如果指定允許user元素的id屬性不在名稱空間中,那麼它是有效的,無論任何模式是否在相應的名稱空間中聲明名爲id的全局屬性。

默認情況下,相同規則適用於XML模式中的元素的屬性 - 頂級「全局」屬性(和元素)聲明屬於模式的targetNamespace,但是屬於(本地)屬性(和元素)聲明嵌套在complexType中不屬於任何名稱空間。這可以通過單個聲明中的form屬性和/或整個模式中的elementFormDefaultattributeFormDefault來控制。所以

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" 
      targetNamespace="humanresources.ns" xmlns:tns="humanresources.ns"> 
    <xs:element name="user"> 
    <xs:complexType> 
     <xs:attribute name="id" type="xs:string" /> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

架構聲稱,在該模式中的targetNamespace名爲沒有命名空間id所需的屬性user元素,而

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" 
      targetNamespace="humanresources.ns" xmlns:tns="humanresources.ns"> 
    <xs:attribute name="id" type="xs:string" /> 
    <xs:element name="user"> 
    <xs:complexType> 
     <xs:attribute ref="tns:id" /> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

(與在頂層聲明的屬性)將意味着user元素需要id屬性,該屬性位於humanresources.ns命名空間中,即

<hr:user hr:id="abc" /> 
+0

這非常有幫助,謝謝。關於你的第一個模式的例子,在沒有命名空間中使用local屬性,那麼這將驗證嗎?:'... '這裏,'id'是合格的,但如果我理解正確,模式/名稱空間中沒有「id」屬性(僅限本地)。 – 2014-08-28 16:58:13

+0

@LukePuplett不,它不會有效。命名空間是元素或屬性名稱的一部分,您有時看到的描述這種語法的是'{namespace} localname',這可能是一種更清晰的思考方式(儘管它不是您可以直接在XML中使用的語法)。我的模式的第一個版本需要一個名爲'{} id'的屬性,但是這個XML具有'{humanresources.ns} id'。 – 2014-08-28 17:21:43