【JavaScript】EdgeやChromeでのXSL変換

だいぶ前にJavaScriptでつくった「XMLを読み込み、XSLで変換してIEで表示するシステム」

お客さん
お客さん

4月からIE使えなくなるから
Edgeになるから

ひろぴよ
ひろぴよ

あれ…

Edgeで動かない、何も表示されない

・・・
ということで急きょシステム改修をすることに。
ActiveXObjectを使っていたのですが、EdgeやChromeだと動かないようでした。
別の方法が分かったので、JavaScriptでXSL変換するところをまとめます。

前提条件

ファイル一式(HTML、XML、XSL)はWebサーバー上に保管
ローカル環境だと動作しないので注意

準備1)XMLのサンプル

野球の選手名が記載されているXML(team.xml)です。

<?xml version="1.0" encoding="utf-8" ?>
<team>
  <name>オリックス・バッファローズ</name>
  <players>
    <player>
      <no>18</no>
      <position>投手</position>
      <name>yamamoto</name>
    </player>
    <player>
      <no>7</no>
      <position>外野手</position>
      <name>yoshida</name>
    </player>
  </players>
</team>

準備2)XSLのサンプル

変換用のXSL(team.xsl)です。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" encoding="utf-8"/>

  <xsl:template match="/">
    <h3><xsl:value-of select="name"/></h3>
    <table>
      <tr>
        <th>背番号</th>
        <th>ポジション</th>
        <th>名前</th>
      </tr>
      <xsl:for-each select="./team/players/player">
        <tr>
          <td><xsl:value-of select="no"/></td>
          <td><xsl:value-of select="position"/></td>
          <td><xsl:value-of select="name"/></td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>

</xsl:stylesheet>

今までのコード(ActiveXObjectを使用 ※IEのみ動作)

HTMLと同じ階層にあるXML(team.xml)とXSL(team.xsl)を読み込み、XSL変換して表示します。
※自作関数は、関数名を「my_」から始めてあります

<!DOCTYPE html>

<html>
    <head>
        <script>
            // onload時に実行
            function my_onLoad(){
                const objXml = my_loadXML('./team.xml');
                const objXsl = my_loadXML('./team.xsl');
                // XSLで変換&表示
                document.getElementById("example").innerHTML = objXml.transformNode(objXsl);
            }
            
            // XMLを読み込む
            // path : 読み込むXMLのパス
            function my_loadXML(path){
                let objXml = new ActiveXObject('Microsoft.XMLDOM');
                objXml.async = false;
	            objXml.load(path);
	            return objXml;
            }
        </script>

        <style>
            th{
                border: solid 1px white;
                background-color: silver;
                text-align: center;
                padding: 2px 15px;
            }
            td{
                padding: 2px 15px;
            }
        </style>
        </head>

    <body onload='my_onLoad()'>
        <div id='example'>
        </div>
    </body>
</html>

変更したコード(XMLHttpRequestを使用 ※EdgeやChromeで動作)

scriptタグ内だけ変更があります。
※自作関数は、関数名を「my_」から始めてあります

<!DOCTYPE html>

<html>
    <head>

        <script>

            // onload時に実行
            function my_onLoad(){
                const objXml = my_loadXML('./team.xml');
                const objXsl = my_loadXML('./team.xsl');
                // XSLをXSLTProcessorに設定
                let objXsltProcessor = new XSLTProcessor();
                objXsltProcessor.importStylesheet(objXsl);
                // XSLで変換&表示
                let eleResult = objXsltProcessor.transformToFragment(objXml, document);
                document.getElementById("example").appendChild(eleResult);
            }

            // XMLを読み込む
            // path : 読み込むXMLのパス
            function my_loadXML(path){
                let objXml = new XMLHttpRequest();
                objXml.open('GET', path, false);
                objXml.send('');
                return objXml.responseXML;
            }
        </script>
    </head>
    
    <style>
        th{
            border: solid 1px white;
            background-color: silver;
            text-align: center;
            padding: 2px 15px;
        }
        td{
            padding: 2px 15px;
        }
    </style>

    <body onload='my_onLoad()'>
        <div id='example'>
        </div>
    </body>
</html>

XSL変換が成功すると、次のように表示されます。

ただし、こちらの方法はIEだとうまく表示されません
IEとEdge両方に対応する方法はこちらの記事です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA