1

每当我调用xml.setNamespace(ns)时,元素的命名空间都会设置为ns,但ns也会添加为另一个命名空间,并带有它自己的元素前缀。我想知道如何在XML.prototype.function::setNamespace不定义的情况下阻止后者发生(我可以修改),@xmlns因为我不能使用 E4X 语法。或者,XML.prototype.function::setAttribute不使用 E4X @attribute 语法(当然除了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();
4

2 回答 2

0

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

在犀牛 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"/>

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

于 2009-10-27T07:45:16.040 回答
0

我满足于刚刚得到<xhtml:my-root xmlns:xhtml="...">...</xhtml:my-root>,所以我将坚持使用命名命名空间(new Namespace(name, nsURI))。

于 2009-10-27T23:12:58.810 回答