我有一个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
?
您可以将默认名称空间更改为XHTML,并对所有其他位置使用名称空间吗?还有[createElementNS](http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-DocCrElNS)用于在特定名称空间中创建元素。 – RobG 2012-03-22 23:12:26
@RobG主机文档具有默认的XHTML名称空间。加载的文件没有,这就是问题所在。如果我将该文档编辑为具有默认的XHTML名称空间(从而将名称空间应用于所有后代),则一切正常。问题是:如果我加载了一个在'错误'命名空间中有节点的XML文档,有没有一种方法可以在不使用递归'createElementNS'和'setAttribute'以及'createTextNode'等的情况下传输它们以在另一个节点中生成类似的节点命名空间?_ – Phrogz 2012-03-22 23:18:25