Windows Scripting Host で XSLT

XSLTとは

XSLT の概要

XSLTとは、XSL の規格のうち、ツリー変換部分のみを定義したXML文書の変換用言語です。

その役割は主に、あるツリーから全く別の構造を持つツリーへと変換する作業を行なうというものです。XML から HTML 文書への変換に用いられる事が多いですが、XMLから別のXML文書の作成にも用いらます。例えるならば、データベース・システムの「クエリ」に近い存在とも言えるでしょう。

XSLT は DOM と並んでXML文書を扱うためには欠かせない存在です。DOM が生成後の文書に対してアクセスするのに対し、XSLT は文書生成自体を司ります。DOM を「動的」という言葉で表現するならば、XSLT は比較的「静的」なスタイルシートとなります。

XSLT を用いて Web サイトのテンプレートを作成しておき、データを記述した XML 文書をそれに通すだけで、ツリーを再構築し望んだ形式の文書を取り出す事が可能です。

参考リンク

Windows Scripting Host とは

WSH 概要

WSH とは、Windows98 以降で簡単に実行できるスクリプト環境です。 ここでは詳細な説明は省きますが、バッチ処理を記述したり特定のアプリケーションを操作したりできます。 これを用いれば、一々プログラムをコンパイルして実行形式に直すなどの手間がかからず、簡単なファイル処理が実行できます。

スクリプト言語には JScript 、VBScript 、PerlScript などが使用されます。ここでは JScript を用います。

参考リンク

XSLT で XML 文書を変換

WSH 用 JScript プログラム

var fileXml = "test.xml"; // 変換する XML 文書
var fileXsl = "template.xsl"; // XSLT で記述された スタイルシート
var fileHtm = "output.html"; // 出力する HTML ファイル名

var objDoc = new ActiveXObject("Msxml2.DOMDocument");
var objStl = new ActiveXObject("Msxml2.DOMDocument");
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var flTxt = fs.CreateTextFile(fileHtm);

objDoc.load(fileXml);
objStl.load(fileXsl);

var txtXml = objDoc.transformNode(objStl);

with(flTxt){
  Write(txtXml);
  Close();
}

変換する方法

  1. 上記ソースをコピー&ペーストでメモ帳等に貼り付けて、拡張子 [.js] で保存する
  2. 変換元の XML 文書、及び XSLT を用意して同じフォルダに保存する
  3. ソースの最初の行のファイル名をそれぞれ修正する
  4. 先程保存した、拡張子 [.js] のファイルをダブルクリックする
  5. 変換後のファイルが生成されているはず

動作環境

実験

実験用 XML データ & XSLT テンプレート

ダウンロードして、ご自由にご利用下さい。

改良案

文字コード宣言を修正する

Msxml 3.0 は何故か勝手に、変換後の文書の xml 宣言中の文字コード宣言に utf-8 をくっ付けてきます。 Shift_JIS で記述した時にはこれが食い違ってしまい、XML パーサによってはエラーを返します。

仕方がないので、無理矢理 Shift_JIS に書き換えるしかありません。 まず、自動的に xml 宣言を出力しないようにします。 XSLT 中の <xsl:output> 要素を次のように書き換えます。

<xsl:output method="xml" version="1.0" encoding="Shift_JIS" indent="yes" omit-xml-declaration="yes" />

そして WSH プログラム中の

var txtXml = objDoc.transformNode(objStl);

という行を

var xmlDim = '<?xml version="1.0" encoding="Shift_JIS" ?>' + "\n\n";
var txtXml = xmlDim + objDoc.transformNode(objStl);

に直せば完了です。

ダイアログBOXを用いてファイルを選択する

入力処理にダイアログBOX を利用すれば便利かもしれません。これまでの方法では一々ファイルを開いて変換するファイル名を書き換えなければならなかったので、ダイアログボックスを開いてファイル名を選択する方法を考えてみました。

WSH には標準入力がないので、コモンダイアログ・コンポーネントと Excel を利用して入力を得ます。 これらがインストールされていなければもちろん実行はできません。

少々長いソースとなってしまったので、詳しい解説は省略します。


var fs = WScript.CreateObject("Scripting.FileSystemObject");

var ComDlg = WScript.CreateObject("MSComDlg.CommonDialog");
ComDlg.MaxFileSize = 256;
ComDlg.InitDir = ".";
ComDlg.Filter = "XML(*.xml)|*.xml";
ComDlg.ShowOpen();
if(ComDlg.FileName.length == 0){WScript.Quit();}

var ComDlg2 = WScript.CreateObject("MSComDlg.CommonDialog");
ComDlg2.MaxFileSize = 256;
ComDlg2.InitDir = ".";
ComDlg2.Filter = "XSL(*.xsl)|*.xsl";
ComDlg2.ShowOpen();
if(ComDlg2.FileName.length == 0){WScript.Quit();}

var objXL = WScript.CreateObject("Excel.Application");
var strRet = objXL.InputBox("XSLT in WHS","出力ファイル名", ".html");
objXL.Quit();


var objDoc = new ActiveXObject("Msxml2.DOMDocument");
objDoc.load(ComDlg.FileName);

var objStl = new ActiveXObject("Msxml2.DOMDocument");
objStl.load(ComDlg2.FileName);
objSav = objDoc.transformNode(objStl);

var fs = WScript.CreateObject("Scripting.FileSystemObject");
var stream = fs.CreateTextFile(strRet);
with(stream){
  Write(objSav);
  Close();
}
WScript.Echo(strRet + "として変換結果を出力しました。");