【问题标题】:Chrome createAttribute malforms prefixChrome createAttribute 格式错误前缀
【发布时间】:2019-11-24 17:40:35
【问题描述】:

我有一个简单的 javascript 片段,它将 exslt 命名空间添加到 xsl 文档。但是,Chrome 和 Firefox 处理这种情况的方式不同。 Firefox 会将命名空间正确添加到具有完整的根目录

xmlns:exsl="http://exslt.org/common"

Chrome 但是只是插入

exsl="http://exslt.org/common"

你看出区别了吗? 'xmlns' 在后者中消失了,Chrome 本身认为 xslt 格式错误:转换时它返回 null!如果前缀正确,即xmlns:exsl,那么 Chrome 就会喜欢它。使用 Firefox 尝试下面的 fiddle,然后使用 Chrome 来查看差异。这是简单的代码

var styleString = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><div>hi</div></xsl:template></xsl:stylesheet>';
var xslDoc = (new DOMParser()).parseFromString(styleString, "text/xml");
var docRoot = xslDoc.documentElement;
a = document.createAttribute("xmlns:exsl");
a.nodeValue = "http://exslt.org/common";
docRoot.setAttributeNode(a);
var xmls1 = new XMLSerializer();
var outputXHtmlString = xmls1.serializeToString(xslDoc);
document.getElementById("content").innerText = outputXHtmlString;

【问题讨论】:

  • 你可以尝试在你的 xslt 上添加这个命名空间吗? var styleString = 'w3.org/1999/XSL/Transform" xmlns:exsl="exslt.org/common"><xsl:template match="/">
    hi
    ';
  • 我正在使用 Javascript 动态添加属性,所以我很欣赏这个建议,但如果硬编码命名空间是解决方案,那么我需要修改大约 100 个 xsl 文件。无论如何,我已经分叉了 jsfiddle,我会尝试你的建议并回复你。
  • 在考虑之后,我宁愿在样式表中硬编码命名空间。这适用于 Chrome 和 Firefox,所以我看不出有什么缺点。看到它在这里工作jsfiddle.net/bodyrock/0vtw8Lrs/23
  • @EdBangga 如果您想将您的评论添加到答案部分,我会选择它作为答案。谢谢!

标签: javascript ajax google-chrome firefox exslt


【解决方案1】:

使用这个

 var styleString = '<xsl:stylesheet version="1.0" xmlns:xsl="w3.org/1999/XSL/Transform" xmlns:exsl="exslt.org/common"><xsl:template match="/"><div>hi</div></xsl:template></xsl:stylesheet>

【讨论】:

  • 这适用于 IE、Chrome 和 Firefox,但我今天发现这在 Edge 中不起作用。 Edge 仍然需要 hack,也就是说,您必须通过 document.createAttribute("xmlns:exsl"); 添加 EXSL;如果您将其硬编码在文档中,如此处所示,则 Edge 会抛出错误“无效参数”
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多