【问题标题】:Not adding a namespace when using xml.setNamespace()使用 xml.setNamespace() 时不添加命名空间
【发布时间】:2010-12-10 06:36:56
【问题描述】:

每当我调用xml.setNamespace(ns) 时,元素的命名空间都会设置为ns,但ns 也会作为另一个命名空间添加到元素中,并带有它自己的前缀。我想知道如何阻止后者发生(我可以修改XML.prototype.function::setNamespace)而不定义@xmlns,因为我不能使用E4X 语法。或者,一个不使用 E4X @attribute 语法的 XML.prototype.function::setAttribute(当然除了使用 function:: 来定义它)会更好。

例子:

var xhtml = new Namespace("http://www.w3.org/1999/xhtml"),
xml = <foo/>;
xml.setNamespace(xhtml);

// what I get:
xml.toXMLString() ===
  <foo
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
  />.toXMLString();

// what I want:
xml.toXMLString() ===
  <foo
    xmlns="http://www.w3.org/1999/xhtml"
  />.toXMLString();

【问题讨论】:

    标签: javascript xml namespaces e4x


    【解决方案1】:

    我只满足于获得 &lt;xhtml:my-root xmlns:xhtml="..."&gt;...&lt;/xhtml:my-root&gt;,所以我将坚持使用命名空间 (new Namespace(name, nsURI))。

    【讨论】:

      【解决方案2】:

      我不知道答案,但是我通过 Rhino 1.7r2 运行了您的代码,它返回了不同的结果。这要么是依赖于实现,要么是我们的 E4X 实现之一是错误的。不知道是哪个。

      在 Rhino 1.7r2 上:

      var xhtml = new Namespace("http://www.w3.org/1999/xhtml"),
      xml = <foo/>;
      xml.setNamespace(xhtml);
      
      js> xml.toXMLString()
      <e4x_0:foo xmlns:e4x_0="http://www.w3.org/1999/xhtml"/>
      

      看起来您遇到了古老的“命名空间前缀应该是微不足道的,但在现实世界中它们实际上很重要”的问题。 :(

      【讨论】:

      • 您的 Rhino 似乎将 setNamespace 视为 addNamespace,它没有被赋予命名空间名称(只是一个 uri)。
      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      相关资源
      最近更新 更多