views:

183

answers:

2

Whenever I call xml.setNamespace(ns), the namespace of the element is set to ns, but ns is also added as another namespace with it's own prefix to the element. I would like to know how to stop the latter from happening (I'm okay with modifying XML.prototype.function::setNamespace) without defining @xmlns as I can't use E4X syntax. Alternatively, an XML.prototype.function::setAttribute that doesn't use E4X @attribute syntax (except of course for the one use of function:: for defining it) would be even better.

Example:

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();
A: 

I don't know the answer, but I ran your code through Rhino 1.7r2, and it returned different results. Either this is implementation-dependent or one of our E4X implementations is buggy. dunno which.

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"/&gt;

Looks like you've run into the age-old "namespace prefixes are supposed to be insignificant, but in the real world they are actually significant" problem. :(

Todd Ditchendorf
Your Rhino seems to be treating `setNamespace` as `addNamespace`, which isn't being given a namespace name (just a uri).
Eli Grey
A: 

I'm content with just getting <xhtml:my-root xmlns:xhtml="...">...</xhtml:my-root> so I'm just going to stick with using a named namespace (new Namespace(name, nsURI)).

Eli Grey