【问题标题】:Change namespace of a DOM node before/during/after import在导入之前/期间/之后更改 DOM 节点的命名空间
【发布时间】:2012-04-07 13:51:20
【问题描述】:

我有一个 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?

【问题讨论】:

  • 您能否将默认命名空间更改为 XHTML 并为其他所有内容使用命名空间?还有createElementNS 用于在特定命名空间中创建元素。
  • @RobG 宿主文档确实有一个默认的 XHTML 命名空间。加载的文档没有,这就是问题所在。如果我将该文档编辑为具有默认的 XHTML 名称空间(从而将名称空间应用于所有后代),一切正常。问题是:如果我加载一个在“错误”命名空间中有节点的 XML 文档,有没有办法在不使用递归 createElementNSsetAttributecreateTextNode 等的情况下传输它们来生成类似的另一个命名空间中的节点?

标签: javascript html xml xhtml namespaces


【解决方案1】:

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

【讨论】:

  • 多么有趣的建议!使用 XSLT 将元素转换为新元素。棘手;不是我要找的东西,但你肯定会因为 AJAXSLT 参考而获得 +1(JS 中的真正 XPath?Joy!)。
猜你喜欢
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
相关资源
最近更新 更多