XSLTとは、XSL の規格のうち、ツリー変換部分のみを定義したXML文書の変換用言語です。
その役割は主に、あるツリーから全く別の構造を持つツリーへと変換する作業を行なうというものです。XML から HTML 文書への変換に用いられる事が多いですが、XMLから別のXML文書の作成にも用いらます。例えるならば、データベース・システムの「クエリ」に近い存在とも言えるでしょう。
XSLT は DOM と並んでXML文書を扱うためには欠かせない存在です。DOM が生成後の文書に対してアクセスするのに対し、XSLT は文書生成自体を司ります。DOM を「動的」という言葉で表現するならば、XSLT は比較的「静的」なスタイルシートとなります。
XSLT を用いて Web サイトのテンプレートを作成しておき、データを記述した XML 文書をそれに通すだけで、ツリーを再構築し望んだ形式の文書を取り出す事が可能です。
WSH とは、Windows98 以降で簡単に実行できるスクリプト環境です。 ここでは詳細な説明は省きますが、バッチ処理を記述したり特定のアプリケーションを操作したりできます。 これを用いれば、一々プログラムをコンパイルして実行形式に直すなどの手間がかからず、簡単なファイル処理が実行できます。
スクリプト言語には JScript 、VBScript 、PerlScript などが使用されます。ここでは 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();
}
ダウンロードして、ご自由にご利用下さい。
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);
に直せば完了です。
これまでの方法では一々ファイルを開いて変換するファイル名を書き換えなければならなかったので、ダイアログボックスを開いてファイル名を選択する方法を考えてみました。
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 + "として変換結果を出力しました。");