使用xml.setNamespace()时不添加命名空间

时间:2009-10-26 20:34:15

标签: javascript xml namespaces e4x

每当我调用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();

2 个答案:

答案 0 :(得分:0)

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

on 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"/>

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

答案 1 :(得分:0)

我很满意只是获得<xhtml:my-root xmlns:xhtml="...">...</xhtml:my-root>所以我只会坚持使用命名空间(new Namespace(name, nsURI))。