我正在努力了解
“Namespaces in XML 1.0 (Third Edition)”定义对不合格属性命名空间的正确解释。
“The namespace name for an unprefixed attribute name always has no value.”
后来在同一节:
“The attribute value in a default namespace declaration MAY be empty. This has the same effect,within the scope of the declaration,of there being no default namespace.”
那么如果我想为一个元素(及其子代)声明一个默认的命名空间,那么我还必须为这个命名空间中的任何属性声明一个前缀 – 命名空间映射?
例如,在这个例子中
<parent xmlns="http://example.com/foo"> <child attrib="value">text</child> <parent>
我会解释上面的定义,说attrib的命名空间是空的。
所以如果我需要属性与父母有相同的命名空间,那么我将被迫这样做?
<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>
这似乎对我来说很愚蠢,因为它似乎打败了默认命名空间的目的。我希望我只是误解了规范。
你是正确的。属性不属于默认命名空间的想法是它们被认为存在于“元素命名空间”中 – 因此在这种情况下,< foo:child />被认为是@attrib的’命名空间’。请注意,这只是概念性的;没有API或任何以这种方式引用属性命名空间的东西。
这被选择是因为多个元素可能具有相同名称的属性,但具有不同的含义 – 与传统的命名空间不同,它是一组名称(因此没有重复项)。在某种程度上,它为命名空间提供了更多的结构,而不是具有一个平面集合。
你可以在a very old version of the Namespaces recommendation阅读这个。
此约定意味着每当您看到一个前缀属性时,它表示一些与文档中的主模式无关的“附加”信息。