代码之家  ›  专栏  ›  技术社区  ›  mckamey

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

  •  24
  • mckamey  · 技术社区  · 14 年前

    "Namespaces in XML 1.0 (Third Edition)" 非限定属性命名空间的定义。

    “非固定属性名称的命名空间名称始终没有值。”

    在同一节的后面:

    所以,如果我想为一个元素(及其子元素)声明一个默认名称空间,我是否也必须为该名称空间中的任何属性声明一个前缀名称空间映射?

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

    我将把上面的定义解释为 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>
    

    这在我看来很愚蠢,因为它似乎违背了默认名称空间的目的。我希望我只是误解了规格。

    3 回复  |  直到 10 年前
        1
  •  17
  •   porges    14 年前

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

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

    a very old version of the Namespaces recommendation .

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

        2
  •  10
  •   Raghu Dodda    10 年前

    根据规范,考虑 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 namespace(是 good 以及)
    • a 治疗 属于不可访问的命名空间 http://wwww.w3.org > good (与

    请注意 http://wwww.w3.org > 好的 命名空间不存在;例如,不能使用XPath查询此命名空间中的属性。如果你要求 namespace-uri(\\good\a) ,它将是空的。为了使单独的元素名称空间的概念具体化,我创建了一个名称空间,该名称空间包含元素名称空间和名称以及分隔符( > 不允许在属性值中取消转义)。

    现在,与其说这两个属性在两个不同的名称空间中,不如说它们属于两个不同的名称空间 命名空间分区 :

    • http://www.w3.org )
    • 元素属于所有的元素类型(也包括 )
    • 好的 http://wwww.w3.org > 好的 ).

    以下是规范Porges的相关部分:

    A.2 XML命名空间分区

    以支持合格与不合格并举的目标 分区。分区为:

    XML命名空间中的所有元素类型都显示在此分区中。每一个都有独特的地方部分;这个 标识元素类型。

    全局属性划分 此分区包含在该命名空间中定义为全局的所有属性的名称。 全局属性唯一需要的特性是 名称在全局属性分区中必须是唯一的。本规范 对这些属性的正确用法不作断言。这个 标识全局属性。

    每个元素类型的分区 All-Element-Types分区中的每个类型都有一个关联的命名空间,其中显示 为该元素提供的非限定属性。这是一个 XML 1.0禁止元素上的名称。组合 元素的类型和名称空间名称唯一的属性名称 标识每个非限定属性。

    在符合本规范的XML文档中,所有 限定的(带前缀的)属性被分配给全局属性 分区,并将所有非限定属性的名称指定给 适当的每元素类型分区。

        3
  •  2
  •   Jörn Horstmann    14 年前

    你对说明书的解释是正确的。您引用的名称空间规范第6.2节第二段中也给出了一些基本原理:

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

        4
  •  0
  •   Boolean_Type    5 年前

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

    元素,而不是属性。