2012-03-22 75 views
2

我有一个XHTML文档。我使用XHR导入了另一个应该是XHTML的XML文档,但作者忘记了在根上放置了一个xmlns。因此,XML文档中的所有节点都没有名称空间。在导入之前/期间/之后更改DOM节点的名称空间

当我从这个其他文档导入一个节点并将其附加到我的文档中时,我得到一个看起来正确的节点(例如<h1>Hi Mom!</h1>),但没有名称空间。因此,网络浏览器应用display:inline

我可以使用如下代码(未经测试)解决这个问题...但我宁愿不要,如果有更好的路由存在:

function changeNodeNamespace(node,namespace){ 
    var dup = document.createElementNS(namespace,node.nodeName); 
    if (node.hasAttributes()){ 
    for (var a=node.attributes,i=a.length;i--;){ 
     dup.setAttributeNS(a[i].namespaceURI,a[i].nodeName,a[i].value); 
    } 
    } 
    if (node.hasChildNodes()){ 
    for (var a=node.childNodes,i=0,len=a.length;i<len;++i){ 
     if (a[i].nodeType==1){ // ELEMENT_NODE 
     dup.appendChild(changeNodeNamespace(a[i],namespace)); 
     }else{ 
     dup.appendChild(a[i].cloneNode(false)); 
     } 
    } 
    } 
    return dup; 
} 

除了重新创作的文件导入我有正确的命名空间,或递归地重新创建基于原始文件的新名称空间中的每个元素/属性/文本节点,我可以自己导入元素并以某种方式将其名称空间更改为http://www.w3.org/1999/xhtml

+0

您可以将默认名称空间更改为XHTML,并对所有其他位置使用名称空间吗?还有[createElementNS](http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-DocCrElNS)用于在特定名称空间中创建元素。 – RobG 2012-03-22 23:12:26

+0

@RobG主机文档具有默认的XHTML名称空间。加载的文件没有,这就是问题所在。如果我将该文档编辑为具有默认的XHTML名称空间(从而将名称空间应用于所有后代),则一切正常。问题是:如果我加载了一个在'错误'命名空间中有节点的XML文档,有没有一种方法可以在不使用递归'createElementNS'和'setAttribute'以及'createTextNode'等的情况下传输它们以在另一个节点中生成类似的节点命名空间?_ – Phrogz 2012-03-22 23:18:25

回答

1

XSLT可以do the trick和图书馆等SarissaAJAXSLT有助于简化JavaScript语法。

+0

多么有趣的建议!使用XSLT将元素转换为新元素。整蛊;不是我想要的,但是你肯定会得到一个AJAXSLT引用的+1(真正的XPath在JS?Joy!中)。 – Phrogz 2012-05-16 20:45:31