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

Change namespace of a DOM node before/during/after import

本文关键字:DOM 节点 命名空间 之后 导入 期间      更新时间:2023-09-26

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

当我从另一个文档导入节点并将其附加到我的文档中时,我得到一个看起来正确的节点(例如 <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

XSLT可以做到这一点,像Sarissa或AJAXSLT这样的库可以帮助简化JavaScript语法。