MSXML with WSH で XSLT

最近は専ら Micorsoft Excel でWeb ページを編集する事が多い。もちろんそのまま『Webページとして保存』などという恐ろしい事はやらないが。XLS→CSVXMLXHTML機械的に変換してくので、以前に比べて作業は格段に楽になった。
それはさておき、MSXML 3.0 で XSLT したときに

<META http-equiv="Content-Type" content="text/html; charset=UTF-16">
やら
<?xml version="1.0" encoding="UTF-16"?>
やらを一々付けてくる“おせっかい”ぶりには本当に閉口する。xml 宣言は omit-xml-declaration="yes" で消す事も可能だったが、method="html" で吐き出した時の余計な meta タグのほうはどうしようもない。仕方がないので JScirpt で物理的に文字列置換する事にした。

var objDoc = new ActiveXObject("Msxml2.DOMDocument");
var objStl = new ActiveXObject("Msxml2.DOMDocument");

var strXmlName = openDialogMenu("xml");
var strXslName = openDialogMenu("xsl");
var strHtmName = openExcelDialog();

objDoc.load(strXmlName);
objStl.load(strXslName);

objSav = objDoc.transformNode(objStl); // XSLTransform

var strCharCode = objStl.getElementsByTagName("xsl:output").item(0).getAttribute("encoding");
strXml = strXml.replace("UTF-16",strCharCode); // “UTF-18”を物理的に置換

saveTextFile(strHtmName,objSav);
WScript.Echo(strHtmName + "として変換結果を出力しました。");

function openDialogMenu(arg1){ // ファイル選択ダイアログ用関数
var ComDlg = WScript.CreateObject("MSComDlg.CommonDialog");
ComDlg.MaxFileSize = 256;
ComDlg.InitDir = ".";
ComDlg.Filter = arg1.toUpperCase() + "(*." + arg1 + ")|*." + arg1;
ComDlg.ShowOpen();
if(ComDlg.FileName.length == 0){WScript.Quit();}
return ComDlg.FileName;
}

function openExcelDialog(){ // ファイル名入力ダイアログ(Excel使用)関数
var objXL = WScript.CreateObject("Excel.Application");
var strRet = objXL.InputBox("XSLT in WHS","出力ファイル名", "output.html");
objXL.Quit();
return strRet;
}

function saveTextFile(arg1,arg2){ // テキストファイル書き出し関数
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var stream = fs.CreateTextFile(arg1);
with(stream){
Write(arg2);
Close();
}
}

これが私が現在わりと利用している XSLTJScriptWSH で動きます。コピー&ペーストしてテキストファイルに拡張子[.js]で保存、作成したファイルをダブルクリックして起動します。
必要な環境を一応述べておくと、

となります。何だか某社の回し者の用な気もしますが、多分気のせいかと。