mck*_*mey 26 xml namespaces xml-namespaces
我试图理解对非限定属性命名空间的"XML 1.0(第三版)中的命名空间"定义的正确解释.
"未加前缀的属性名称的命名空间名称始终没有值."
后来在同一部分:
"默认名称空间声明中的属性值可能为空.在声明范围内,没有默认名称空间,这具有相同的效果."
因此,如果我想为元素(及其子元素)声明默认命名空间,是否还必须为驻留在该命名空间内的任何属性声明前缀命名空间映射?
例如,在此示例中
<parent xmlns="http://example.com/foo">
<child attrib="value">text</child>
<parent>
Run Code Online (Sandbox Code Playgroud)
我会解释上面的定义,说明名称attrib
空是空的.
所以,如果我需要attrib
具有相同的命名空间parent
,那么我将被迫这样做?
<foo:parent xmlns:foo="http://example.com/foo">
<foo:child foo:attrib="value">text</foo:child>
<foo:parent>
Run Code Online (Sandbox Code Playgroud)
或这个?
<parent xmlns="http://example.com/foo" xmlns:foo="http://example.com/foo">
<child foo:attrib="value">text</child>
<parent>
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很愚蠢,因为它似乎打败了默认命名空间的目的.我希望我只是误解了规范.
por*_*ges 16
你说的没错.不属于默认命名空间的属性背后的想法是它们被认为存在于"元素命名空间"中 - 因此在这种情况下,它<foo:child/>
被认为是"命名空间" @attrib
.请注意,这只是概念性的; 没有API或任何以这种方式引用属性命名空间的东西.
选择此选项是因为多个元素可能具有相同名称但具有不同含义的属性 - 与传统名称空间不同,后者是一组名称(因此不重复).在某种程度上,它为命名空间提供了更多结构,而不是具有平面集.
您可以在命名空间建议的旧版本中阅读此内容.
此约定意味着每当您看到带前缀的属性时,它表示一些与文档中的主模式无关的"附加"信息.
根据规范,您认为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>
Run Code Online (Sandbox Code Playgroud)
这符合,因为这两个属性确实在两个不同的命名空间中:
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文档中,所有限定(加前缀)属性的名称都将分配给全局属性分区,并且所有非限定属性的名称将分配给相应的每个元素类型的分区.