在导入之前/期间/之后更改DOM节点的命名空间

时间:2012-03-22 23:01:33

标签: javascript html xml xhtml namespaces

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

当我从这个其他文档导入节点并将其附加到我的文档时,我得到一个看起来正确的节点(例如<h1>Hi Mom!</h1>)但没有名称空间。因此,Web浏览器应用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;
}

除了重新编写我导入的文档以具有正确的命名空间,或者 - 基于原件在新命名空间中递归地重新创建每个元素/属性/ textnode之外,我可以导入元素本身并以某种方式将其名称空间更改为http://www.w3.org/1999/xhtml

1 个答案:

答案 0 :(得分:1)

XSLT可以do the trick,而SarissaAJAXSLT等库可以帮助简化JavaScript语法。