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 参数而不是&lt;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 中工作

MQTT 连接在 Node 中工作,但不能作为 ReactJS 组件

为啥 getResourceAsStream() 可以在 IDE 中工作,但不能在 JAR 中工作?