8

IE11 中的 XSLT 处理发生了什么?

在 IE8/9/10 上,您可以使用:

if (window.ActiveXObject) {
    var xslt = new ActiveXObject("Msxml2.XSLTemplate");
    ....
}

在 Chrome/Firefox/Safari 上,您可以使用:

else { 
    var xsltProcessor = new XSLTProcessor();
}

但是在 IE11 上,这些都不支持。有谁知道如何做到这一点?

4

6 回答 6

12

尝试

if (window.ActiveXObject || "ActiveXObject" in window)

这对我使用 IE11 很有用,并且允许我实例化 ActiveX 对象,因为标准的旧检查被绕过了。

于 2013-10-10T18:56:01.967 回答
2

这适用于 Chrome/Edge/Firefox/IE11

 function loadXMLDoc(filename) {
     if (window.ActiveXObject || "ActiveXObject" in window) {
         xhttp = new ActiveXObject("Msxml2.XMLHTTP");
     } else {
         xhttp = new XMLHttpRequest();
     }
     xhttp.open("GET", filename, false);
     xhttp.send("");
     return xhttp.responseXML;
 }


 if (window.ActiveXObject || "ActiveXObject" in window) {
     ie();
 } else {

     xml = loadXMLDoc("input.xml");
     xsl = loadXMLDoc("mmlctop2_0.xsl");

     if (document.implementation && document.implementation.createDocument) {
         xsltProcessor = new XSLTProcessor();
         xsltProcessor.importStylesheet(xsl);
         resultDocument = xsltProcessor.transformToDocument(xml, document);

         var serializer = new XMLSerializer();
         var transformed = serializer.serializeToString(resultDocument.documentElement);

         alert(transformed);
     }
 }

 // https://msdn.microsoft.com/en-us/library/ms753809(v=vs.85).aspx
 function ie() {

     var xslt = new ActiveXObject("Msxml2.XSLTemplate.3.0");
     var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0");
     var xslProc;
     xslDoc.async = false;
     xslDoc.load("mmlctop2_0.xsl");
     if (xslDoc.parseError.errorCode != 0) {
         var myErr = xslDoc.parseError;
         alert("You have error " + myErr.reason);
     } else {
         xslt.stylesheet = xslDoc;
         var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
         xmlDoc.async = false;
         xmlDoc.load("input.xml");
         if (xmlDoc.parseError.errorCode != 0) {
             var myErr = xmlDoc.parseError;
             alert("You have error " + myErr.reason);
         } else {
             xslProc = xslt.createProcessor();
             xslProc.input = xmlDoc;
             xslProc.addParameter("param1", "Hello");
             xslProc.transform();
             alert(xslProc.output);
         }
     }


 }
于 2017-11-05T21:51:30.227 回答
1

在 IE11 中失败的原因if(window.ActiveXObject)是由于某种原因window.ActiveXObject变得falsy,即使它仍然是一个函数。我已经在我的特征检测中变得更加明确:

if(window.ActiveXObject !== undefined){
    ...
}

此方法还涵盖检查存在但未设置为真值的属性的情况:

if(document.createElement("span").draggable !== undefined){
    ...
}
于 2013-11-24T17:35:22.577 回答
1

您可以考虑Saxon CE,一个完全用 JavaScript 实现的 XSLT 2.0 处理器。这将为您提供跨所有浏览器的一致 API,并允许您使用更强大的 XSLT 2.0 语言而不是 1.0 进行编码。

于 2013-09-19T10:23:08.557 回答
1

对我来说,在 IE中以兼容模式运行站点- 11 解决了这个问题....

注意:这可能不是一个解决方案,但如果我的旧站点使用上述代码,我会遇到这样的情况。但我无法重新编码网站

于 2015-09-28T09:51:17.570 回答
0

您可以使用(窗口中的“ActiveXObject”)这将允许所有 IE 浏览器进入 if 条件。经验:-

if ("ActiveXObject" in window) {
// Internet Explorer For all versions like IE8 , IE9 , IE10 or IE11 etc
}else{
// code for Mozilla, Firefox, Opera, etc.
        }
于 2016-08-26T10:07:39.737 回答