当前位置: 首页 > 知识库问答 >
问题:

Microsft Edge和Internet Explorer浏览器中未加载XSLT和XML内容的问题

夹谷辰沛
2023-03-14

我注意到下面的JavaScript代码似乎没有将任何XML或XSLT数据从相应的文件加载到Internet Explorer或Microsoft Edge浏览器中,我不确定我写错了什么。

下面是我用来加载内容的两个JavaScript函数…

function loadXMLDoc(filename) {
    if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else {
        xhttp = new XMLHttpRequest();
    }
    xhttp.open("GET", filename, false);
    try {
        xhttp.responseType = "msxml-document"
    } catch (err) {
    } // Helping IE11
    xhttp.send("");
    return xhttp.responseXML;
}

function displayXMLDoc(xml_file, xsl_file, element_id) {
    xml = loadXMLDoc(xml_file);
    xsl = loadXMLDoc(xsl_file);

    // BROWSER IS IE / EDGE.
    if (window.ActiveXObject) {
        ex = xml.transformNode(xsl);
        document.getElementById(element_id).innerHTML = ex;
    }
    else if (document.implementation && document.implementation.createDocument) {
        var xsltProcessor = new XSLTProcessor();
        xsltProcessor.importStylesheet(xsl);
        var resultDocument = xsltProcessor.transformToFragment(xml, document);
        document.getElementById(element_id).appendChild(resultDocument);
    }
}

下面是这些函数是如何被调用的...

<body onload="displayXMLDoc('myfile.xml', 'myfile.xsl', 'myoutput');">

请注意:

代码目前适用于所有其他浏览器,例如FireFox和Chrome。

共有1个答案

贾骏喆
2023-03-14

考虑到Edge、Chrome和Firefox的当前版本支持promise,现在的一种方法是使用库在IE中支持promise,然后使用promises处理XML和XSLT文档的异步加载。这样,加载XML文档和XSLT文档并应用XSLT转换以获得HTML结果的代码,以及设置一些XSLT参数的选项,如下所示:

 function loadDoc(url) {
       return new Promise(function(resolve) {
         var req = new XMLHttpRequest();
         req.open("GET", url);
         if (typeof XSLTProcessor === 'undefined') {
           try {
             req.responseType = 'msxml-document';
           }
           catch (e) {}
         }
         req.onload = function() {
           resolve(this.responseXML)
         }
         req.send();
       });
  }

  function transform(xmlUrl, xslUrl, xsltParams, targetElement) {
    Promise.all([loadDoc(xmlUrl), loadDoc(xslUrl)]).then(function(data) {
      var xmlDoc = data[0];
      var xslDoc = data[1];

      if (typeof XSLTProcessor !== 'undefined') {
        var proc = new XSLTProcessor();
        proc.importStylesheet(xslDoc);

        for (var prop in xsltParams) {
          proc.setParameter(null, prop, xsltParams[prop]);
        }

        var resultFrag = proc.transformToFragment(xmlDoc, targetElement.ownerDocument);

        targetElement.textContent = '';
        targetElement.appendChild(resultFrag);
      }
      else {
          var template = new ActiveXObject('Msxml2.XslTemplate.6.0');
          template.stylesheet = xslDoc;
          var proc = template.createProcessor();

          for (var prop in xsltParams) {
            proc.addParameter(prop, xsltParams[prop]);
          }

          proc.input = xmlDoc;

          proc.transform();

          var resultHTML = proc.output;

          targetElement.innerHTML = resultHTML;
      }
    });
  }

然后可以将其称为

transform('file.xml', 'input.xsl', { ids : 'test_value2'}, document.getElementById('d1'));

其中第三个参数是一个Javascript对象,其中包含要为XSLT样式表设置的任何参数,例如,如果XSLT是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <!-- pass in a string with a single id value for the parameters ids or a '|' separated list of ids -->
    <xsl:param name="ids" select="''"/>

    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">

        <xsl:for-each select="products/test[$ids = '' or contains(concat('|', $ids, '|'), id)]">
            <a href="#"> Hello # <xsl:value-of select="value"/></a>
        </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

然后上面的Javascript片段设置ids参数。

XML输入示例为

<?xml version="1.0" encoding="UTF-8"?>
<products>

    <test>
        <id>test_value1</id>
        <value>1</value>
    </test>

    <test>
        <id>test_value2</id>
        <value>2</value>
    </test>

</products>

在Windows 10上使用当前版本的IE、Edge、Chrome和Firefox的在线示例位于https://martin-honnen.github.io/xslt/arcor-archive/2016/test2016081501.html。

      function loadDoc(url) {
           return new Promise(function(resolve) {
             var req = new XMLHttpRequest();
             req.open("GET", url);
             if (typeof XSLTProcessor === 'undefined') {
               try {
                 req.responseType = 'msxml-document';
               }
               catch (e) {}
             }
             req.onload = function() {
               resolve(this.responseXML)
             }
             req.send();
           });
      }
      
      function transform(xmlUrl, xslUrl, xsltParams, targetElement) {
        Promise.all([loadDoc(xmlUrl), loadDoc(xslUrl)]).then(function(data) {
          var xmlDoc = data[0];
          var xslDoc = data[1];
          
          if (typeof XSLTProcessor !== 'undefined') {
            var proc = new XSLTProcessor();
            proc.importStylesheet(xslDoc);
            
            for (var prop in xsltParams) {
              proc.setParameter(null, prop, xsltParams[prop]);
            }
            
            var resultFrag = proc.transformToFragment(xmlDoc, targetElement.ownerDocument);
            
            targetElement.textContent = '';
            targetElement.appendChild(resultFrag);
          }
          else {
              var template = new ActiveXObject('Msxml2.XslTemplate.6.0');
              template.stylesheet = xslDoc;
              var proc = template.createProcessor();
              
              for (var prop in xsltParams) {
                proc.addParameter(prop, xsltParams[prop]);
              }
              
              proc.input = xmlDoc;
              
              proc.transform();
              
              var resultHTML = proc.output;
              
              targetElement.innerHTML = resultHTML;
          }
        });
      }
      
      document.addEventListener('DOMContentLoaded', function() {
        transform('http://home.arcor.de/martin.honnen/cdtest/test2016081501.xml', 'http://home.arcor.de/martin.honnen/cdtest/test2016081501.xsl', { ids : 'test_value2'}, document.getElementById('d1'));
      })
<script src="https://www.promisejs.org/polyfills/promise-7.0.4.min.js"></script>

    <h1>Testing XSLT transformation</h1>
    <div id="d1"></div>
 类似资料:
  • 然后它说没有预览可用。谁能告诉我这里出了什么问题。

  • 在阅读了Vue、Vuex和Vue路由器的许多示例和文档后,我完成了以下项目:https://jsfiddle.net/junihh/30wda1em/5/ 当我尝试从Post部分加载一行时,即使一切正常,Vuex存储中的值也是空的。以下是组件: 这里是更新state.currentPost值并调用"postContent"组件的组件。 这里有人帮忙吗?我被困在那个问题上了。

  • 我真的很讨厌instagram应用内浏览器。它显示的内容几乎不同于所有普通浏览器。出于某种原因,我的图像无法加载。 我的网站链接到其他网站的图像。但是这些图像没有扩展。(不确定这是否是问题所在) 这些图片不会加载到instagram应用程序内浏览器中。但在所有其他浏览器中,图像加载没有问题。 此外,我的网站是https,而图像是HTTP。不确定这是否有影响。 有没有办法在instagram应用内浏

  • 问题内容: 我很清楚使用URL片段来跟踪AJAX支持的网页上的状态的技术,但是最近我注意到很多站点在做类似的事情但没有片段。 例如,最新版本的Facebook中的图片查看器以这种方式运行。左侧和右侧导航按钮是简单的链接,没有片段,单击这些片段可以更改浏览器的URL,而无需加载整个页面。 另一个示例是GitHub的存储库浏览器,每个文件/文件夹都是一个简单的链接,可更改页面状态和浏览器URL,而无需

  • 在一个模块中使用了 node 的 Events 和 Path 模块,现在希望模块能够同时在 node 中和浏览器中使用,有什么类似的模块可以兼容这两个环境,最好 api 的实现上和 node 模块大致一样。

  • 我正在使用Saxon 9.4家庭版(Saxon-HE 9.4. NET)来获得对XSLT 2.0和XPath 2.0以及XQuery 1.0的支持。NET。当我加载没有URI的文件时,我的代码会崩溃。 是否可以在没有与加载的文档相关的URI的情况下加载xml/xsl文档 如果没有,是否有任何方法可以为嵌入在dll文件中的元素定义URI 任何其他解决方案也将被理解,我唯一的术语是文件必须从dll文件