为什么没有XMLNS前缀的XML属性不等于具有相同本地名称的前缀属性?

时间:2011-11-02 17:06:56

标签: xml w3c xml-namespaces xml-attribute

当默认命名空间和带前缀的命名空间解析为相同的命名空间URI时,为什么没有前缀的属性不等于前缀属性,当两者具有相同的本地名称时?

“XML中的命名空间”规范只是说它是如此,但它的原因非常简短。 任何人都知道为什么会这样?

摘自http://www.w3.org/TR/xml-names11/#uniqAttrs上的“6.3属性的唯一性”部分:

  

例如,以下每个错误的空元素标记都是非法的:

<!-- http://www.w3.org is bound to n1 and n2 -->
<x xmlns:n1="http://www.w3.org" 
   xmlns:n2="http://www.w3.org" >
  <bad a="1"     a="2" />
  <bad n1:a="1"  n2:a="2" />
</x>
     

但是,以下各项都是合法的,第二种是因为默认命名空间不适用于属性名称:

<!-- http://www.w3.org is bound to n1 and is the default -->
<x xmlns:n1="http://www.w3.org" 
   xmlns="http://www.w3.org" >
  <good a="1"     b="2" />
  <good a="1"     n1:a="2" />
</x>

我认为这只会使解析命名空间的XML变得更加困难,因为解析器必须检查两个属性的存在并选择一个。

就我而言,我喜欢将Atom链接添加到我的XML文档中:

<root xmlns="..." xmlns:atom="...">
    <atom:link rel="self" type=".." href=".." />
</root>

我认为atom:link上的属性会继承元素名称空间。在Java中使用DOM解析XML报告了元素的Atom命名空间,但没有为属性命名空间。

1 个答案:

答案 0 :(得分:1)

简短回答:无前缀属性总是在空名称空间中,即它们没有名称空间。

在示例中:

<good a="1"     n1:a="2" />

第一个将扩展为

{}a

而第二个会扩展为:

{http://www.w3.org}a

在原子示例中,所有属性都在空名称空间中。