2016-08-14 223 views
2

次のJavaScriptコードは、対応するファイルのXMLまたはXSLTデータがInternet ExplorerまたはMicrosoft Edgeブラウザに読み込まれていないようです私が間違って書いたことは分かりません。以下は XSLTおよびXMLコンテンツがMicrosft EdgeおよびInternet Explorerブラウザに読み込まれない問題

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

はご注意ください...私は、コンテンツをロードするために使用しています2つの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); 
    } 
} 

そして、これらの関数が呼び出されている方法です、次のとおりです。

このコードは現在、FireFoxやChromeなどの他のすべてのブラウザで動作しています。

+0

まあ、エッジは 'XSLTProcessor'をサポートし、あなたがそのインターフェイス/オブジェクトのサポートをチェックするコードを書きたいならば、あなたがすべきですもちろんそれを直接チェックする'document.implementation'のような関連性のないものをチェックしたり、XSLTプロセッサーの存在を前提にする代わりに、' if(typeof XSLTProcessor!== 'undefined'){//ここでXSLTProcessorを使用} ' IEについては、どのバージョンのIEをターゲットにしていますか?また、コードが失敗したときにIEまたはEdgeコンソールにエラーメッセージが表示されますか? –

+0

'if(window.ActiveXObject)'が "BROWSER IS IE/EDGE"のようにチェックされているのはナンセンスですが、IE 11とEdgeのどちらもそのチェックには当てはまりません。 –

+0

Chrome、Firefox、およびEdgeの場合、http://plnkr.co/edit/Neqn90as6h9wUGg5qWNC?p=previewで使用されている方法を使用できます。 –

答えて

3

Promise現在、Edge、Chrome、Firefoxの最新バージョンをサポートしているということを考えると、IEでPromiseのサポートを利用するライブラリを使用して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; 
     } 
    }); 
    } 

それは、その後のように呼び出すことができます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で

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

は、例えば、XSLTスタイルシートに設定する任意のパラメータを持つオブジェクトvascriptスニペットは、idsパラメータを設定します。

XML入力サンプルは、Windows 10上のIE、エッジ、ChromeとFirefoxの現在のバージョンで作業し

<?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> 

オンラインサンプルが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>

関連する問題