我试图理解对非限定属性命名空间的"Namespaces in XML 1.0 (Third Edition)"定义的正确解释。
“未加前缀的属性名称的命名空间名称始终没有值。”
后来在同一部分:
“默认名称空间声明中的属性值可能为空。在声明范围内,没有默认名称空间,这具有相同的效果。”
因此,如果我想为元素(及其子元素)声明默认命名空间,是否还必须为驻留在该命名空间内的任何属性声明前缀命名空间映射?
例如,在此示例中
<parent xmlns="http://example.com/foo">
<child attrib="value">text</child>
<parent>
我会解释上面的定义,说明attrib
的名称空间是空的。
因此,如果我需要attrib
与parent
具有相同的名称空间,那么我将被迫这样做?
<foo:parent xmlns:foo="http://example.com/foo">
<foo:child foo:attrib="value">text</foo:child>
<foo:parent>
还是这个?
<parent xmlns="http://example.com/foo" xmlns:foo="http://example.com/foo">
<child foo:attrib="value">text</child>
<parent>
这对我来说似乎很愚蠢,因为它似乎打败了默认命名空间的目的。我希望我只是误解了规范。
答案 0 :(得分:15)
你是对的。属性不属于默认命名空间的想法是它们被认为存在于“元素命名空间”中 - 因此在这种情况下,<foo:child/>
被认为是@attrib
的“命名空间”。请注意,这只是概念性的;没有API或任何以这种方式引用属性命名空间的东西。
选择此选项是因为多个元素可能具有相同名称但具有不同含义的属性 - 与传统名称空间不同,后者是一组名称(因此没有重复名称)。在某种程度上,它为命名空间提供了更多结构,而不是具有平面集。
您可以在a very old version of the Namespaces recommendation中了解相关信息。
此约定意味着每当您看到带前缀的属性时,它表示一些与文档中的主模式无关的“附加”信息。
答案 1 :(得分:6)
根据规范,您认为第一个示例中attrib
的命名空间为空是正确的。然而,这里有一个微妙的东西,可能不是很明显。
在具有两个具有相同名称的属性(一个前缀和另一个前缀)的元素的规范中进一步考虑此示例。
<!-- This is OK, even though an element cannot have two attributes
with the same name -->
<x xmlns:n1="http://www.w3.org"
xmlns="http://www.w3.org" >
<good a="1" n1:a="2" />
</x>
这是符合的,因为这两个属性确实在两个不同的命名空间中:
n1:a
属于http://www.w3.org
命名空间(也是good
的命名空间)a
被处理属于无法访问的名称空间http://wwww.w3.org > good
(与good
的名称空间不同)。请注意,http://wwww.w3.org > good
命名空间不存在;例如,您无法使用XPath查询此命名空间中的属性。如果您要求namespace-uri(\\good\a)
,它将为空。为了使单独的元素名称空间具体化,我构建了一个名称空间,它既包含元素名称空间,又包含名称和分隔符(>
不允许在属性值中取消转义)。
现在,不是说这两个属性在两个不同的命名空间中,而是说它们属于两个不同的命名空间分区更为正确:
n1:a
属性属于全局属性分区(http://www.w3.org
)good
元素属于所有元素类型分区(也是http://www.w3.org
)a
属于good
的每个元素类型分区(即http://wwww.w3.org > good
)。 以下是与Porges相关的规范的相关部分:
A.2 XML命名空间分区
为了支持合格和不合格的目标 在满足其预期目的时有用的名称,我们确定名称 出现在XML命名空间中属于几个不相交的一个 传统(即集合结构化)名称空间,称为名称空间 分区。分区是:
所有元素类型分区 XML命名空间中的所有元素类型都出现在此分区中。每个都有一个独特的本地部分;该 唯一地命名空间名称和本地部分的组合 标识元素类型。
全局属性分区此分区包含在此命名空间中定义为全局的所有属性的名称。 全局属性唯一需要的特性就是它 name在全局属性分区中是唯一的。这个规范 对这些属性的正确使用没有断言。该 唯一地命名空间名称和属性名称的组合 标识全局属性。
每元素类型分区所有元素类型分区中的每个类型都有一个关联的命名空间,其中显示了 为该元素提供的非限定属性。这是一个 传统命名空间因为重复属性的出现 XML 1.0禁止元素上的名称。结合了 具有元素类型和命名空间名称的属性名称唯一 识别每个不合格的属性。
在符合本规范的XML文档中,所有的名称 限定(加前缀)属性将分配给全局属性 分区,并分配所有非限定属性的名称 适当的每元素类型分区。
答案 2 :(得分:2)
您对规范的解释是正确的。在您引用的命名空间规范中,第6.2节的第二段也提供了某种基本原理:
对无前缀属性的解释由它们出现的元素决定。
但我也会对为什么选择这种特定行为的更多细节感兴趣。
答案 3 :(得分:0)
我在"XML in a Nutshell" by Elliotte Rusty Harold中找到了明确的解释:
属性是另外一个故事。默认名称空间仅适用于 元素,而不是属性。