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

问题描述:

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

“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> 

我认为,对原子的属性:链接将继承元素的命名空间。用Java在DOM中解析XML报告了该元素的Atom名称空间,但没有为该属性命名空间。

简答:前缀不变的属性总是在空的名称空间中,即它们没有名称空间。

在该实例中:

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

第一一将扩展为

{}a 

而第二将扩展为:

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

在您的原子例如,所有的属性是在空的名字空间中。

+1

今天我偶然发现了同样的错误。但在这种情况下,我不明白为什么不允许使用' rds

+0

因为'xmlns:ns2 =“”'是对NS声明绑定使用'ns2'前缀,这将在范围内。因此在写完之后,不能使用前缀'ns2'。它不受任何NS的约束。 – lkuty

+0

请注意,“空NS”不存在。如果您认为它存在,会导致混淆。请参阅Ronald Bourret的[命名空间神话分解](http://www.rpbourret.com/xml/NamespaceMyths.htm)。 – lkuty