XML 转换错误。在 IE8 中工作,但不能在其他浏览器中工作。 xmlDOM transformNode 打破了较新的浏览器
Posted
技术标签:
【中文标题】XML 转换错误。在 IE8 中工作,但不能在其他浏览器中工作。 xmlDOM transformNode 打破了较新的浏览器【英文标题】:XML transformation error. Working in IE8 but not an other browser. xmlDOM transformNode breaking newer browsers 【发布时间】:2021-11-21 11:27:34 【问题描述】:我在运行以下脚本时遇到浏览器问题。这是我继承的一个非常古老的应用程序,我找不到不超过 5、7 和 10 年前的这个问题的参考。
该脚本仅在IE7兼容模式下运行时有效,在任何其他浏览器中均无效。
gei("calUTA").innerhtml = "<td><xml id=\"calXSLUTA\"><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:template match=\"/\"><xsl:for-each select=\"/root/month\"><xsl:if test=\"name=\'"+moName[showMo]+"\' and year=\'"+showYr+"\'\"><xsl:value-of select=\"uta\"/></xsl:if></xsl:for-each></xsl:template></xsl:stylesheet></xml></td>";
loopTrans("calXSLUTA","calUTA","big");
function loopTrans(f1,f2,z)
if (z == "big" || z == "stu")
xmlDOM = gei(z + "XML").XMLDocument;
xslDOM = eval(f1 + ".XMLDocument");
gei(f2).innerHTML = xmlDOM.transformNode(xslDOM);
较新的浏览器在执行 transformNode 函数时似乎出错。任何帮助将不胜感激。
返回的具体错误信息是“无法获取未定义或空引用的属性‘transformNode’”。
【问题讨论】:
【参考方案1】:在任何其他浏览器(但基于 IE 的浏览器)中通过浏览器从 javascript 运行客户端 XSLT 1.0 的 API 记录在 https://developer.mozilla.org/en-US/docs/Web/API/XSLTProcessor。在最新的 IE 版本中甚至不支持整个 IE 遗留的东西,比如 XML 数据岛,尽管它们仍然应该允许您实例化 new ActiveXObject('Msxml2.DOMDocument.3.0')
以将 XML DOM 文档转换为 loadXML
XML 输入或字符串中的 XSLT 代码(或从 URL 加载的 load
方法)然后在创建的 XML DOM 上运行 transformNode
。
所以 IE 代码会是这样的
var xmlDoc = new ActiveXObject('Msxml2.DOMDocument.3.0');
xmlDoc.loadXML('<root><month>..<\/month><\/root>');
var xsltDoc = new ActiveXObject('Msxml2.DOMDocument.3.0');
xsltDoc.loadXML('<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:template match=\"/\"><xsl:for-each select=\"/root/month\"><xsl:if test=\"name=\'"+moName[showMo]+"\' and year=\'"+showYr+"\'\"><xsl:value-of select=\"uta\"/></xsl:if></xsl:for-each></xsl:template></xsl:stylesheet>');
var transformationResult = xmlDoc.transformNode(xsltDoc); // assign the result string to innerHTML of an HTML element to render it
其他浏览器,如
var domParser = new DOMParser();
var xmlDoc = domParser.parseFromString('<root><month>..<\/month><\/root>', 'application/xml');
var xsltDoc = domParser.parseFromString('<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:template match=\"/\"><xsl:for-each select=\"/root/month\"><xsl:if test=\"name=\'"+moName[showMo]+"\' and year=\'"+showYr+"\'\"><xsl:value-of select=\"uta\"/></xsl:if></xsl:for-each></xsl:template></xsl:stylesheet>', 'application/xml');
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsltDoc);
var transformationResult = xsltProcessor.transformToFragment(xmlDoc, document); // insert this document fragment with e.g. appendChild to HTML element to render it
无论如何,如果您不需要 IE 支持,我会考虑放弃 XSLT 1 并改用 Saxon-JS 2 和 XSLT 3。在任何情况下,使用带有xsl:param
的XSLT 参数而不是<xsl:if test=\"name=\'"+moName[showMo]+"\'
中的字符串连接应该会使代码更加健壮。
【讨论】:
谢谢。会打的。以上是关于XML 转换错误。在 IE8 中工作,但不能在其他浏览器中工作。 xmlDOM transformNode 打破了较新的浏览器的主要内容,如果未能解决你的问题,请参考以下文章
为啥字体松鼠 @font-face 生成器不能在 IE8 中工作?
如何在 IE9 中将 Enter 转换为 Tab(焦点更改)?它在IE8中工作
jQuery 示例(在 jsfiddle 中)在 Firefox 中工作,但在 IE8、7 中没有
为啥这个 jQuery AJAX PUT 可以在 Chrome 中工作,但不能在 FF 中工作