XML默认名称空间用于非限定属性名称?

问题描述 投票:25回答:4

我试图理解对非限定属性命名空间的"Namespaces in XML 1.0 (Third Edition)"定义的正确解释。

“未加前缀的属性名称的命名空间名称始终没有值。”

后来在同一部分:

“默认名称空间声明中的属性值可能为空。在声明范围内,没有默认名称空间,这具有相同的效果。”

因此,如果我想为元素(及其子元素)声明默认命名空间,是否还必须为驻留在该命名空间内的任何属性声明前缀命名空间映射?

例如,在此示例中

<parent xmlns="http://example.com/foo">
    <child attrib="value">text</child>
<parent>

我会解释上面的定义,说attrib的命名空间是空的。

所以,如果我需要attribparent具有相同的命名空间,那么我将被迫这样做?

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

这对我来说似乎很愚蠢,因为它似乎打败了默认命名空间的目的。我希望我只是误解了规范。

xml namespaces xml-namespaces
4个回答
16
投票

你说的没错。不属于默认命名空间的属性背后的想法是它们被认为存在于“元素命名空间”中 - 因此在这种情况下,<foo:child/>被认为是@attrib的“命名空间”。请注意,这只是概念性的;没有API或任何以这种方式引用属性命名空间的东西。

选择此选项是因为多个元素可能具有相同名称但具有不同含义的属性 - 与传统名称空间不同,后者是一组名称(因此不重复)。在某种程度上,它为命名空间提供了更多结构,而不是具有平面集。

你可以在a very old version of the Namespaces recommendation读到这个。

此约定意味着每当您看到带前缀的属性时,它表示一些与文档中的主模式无关的“附加”信息。


8
投票

根据规范,在第一个示例中将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命名空间中的所有元素类型都出现在此分区中。每个都有一个独特的本地部分;命名空间名称和本地部分的组合唯一标识元素类型。

全局属性分区此分区包含在此命名空间中定义为全局的所有属性的名称。全局属性唯一需要的特性是其名称在全局属性分区中是唯一的。该规范没有对这些属性的正确使用做出任何断言。命名空间名称和属性名称的组合唯一标识全局属性。

每元素类型分区所有元素类型分区中的每个类型都有一个关联的命名空间,其中显示为该元素提供的非限定属性的名称。这是一个传统的命名空间,因为XML 1.0禁止在元素上出现重复的属性名称。属性名称与元素的类型和名称空间名称的组合唯一地标识每个非限定属性。

在符合此规范的XML文档中,所有限定(加前缀)属性的名称都将分配给全局属性分区,并且所有非限定属性的名称将分配给相应的每个元素类型的分区。


2
投票

您对规范的解释是正确的。在您引用的命名空间规范中,第6.2节的第二段中也给出了某种基本原理:

对无前缀属性的解释由它们出现的元素决定。

但我也会对为什么选择这种特定行为的更多细节感兴趣。


0
投票

我在"XML in a Nutshell" by Elliotte Rusty Harold找到了明确的解释:

属性是一个不同的故事。默认命名空间仅适用于元素,而不适用于属性。

© www.soinside.com 2019 - 2024. All rights reserved.