10

フレームワークを msxml4 から msxml6 に移行する予定です。まだ msxsl.exe を使用しています。コマンド ライン msxsl.exe -u バージョン 6.0 でわかるように、4.0 までの MSXML バージョンのみをサポートしているようです。msxsl.exe の後継はありますか? 代替のコマンド ライン プロセッサはありますか?

4

1 に答える 1

11

既存のプロセッサを置き換える方法はいくつかありますが、必要な機能のレベルと、MSXML 固有の機能が必要かどうかによって異なります。たとえば、libxslt の一部であるxsltprocがあります (たとえば、ここからいくつかの Windows バイナリを取得できます)。このページでは、C# で簡単に置き換えることができますが、どちらもコマンド ラインの使用方法が変更され、同じ MSXML 拡張機能が実装されていない可能性があります (xsltproc は確かにそうではありません)。

MSXML 6 を使用する単純なコマンド ライン プロセッサに関心がある場合は、単純な JScript アプリケーションを使用するよりも悪い結果になる可能性があります。次のコードをxsltr.jsとして保存し、 cscript xsltr.js input.xml template.xsl output.txtとして実行します。

var adTypeBinary = 1;
var adSaveCreateOverWrite = 2;
var adSaveCreateNotExist = 1;

try
{
    var args = WScript.Arguments;

    if(args.length < 3)
    {
        WScript.Echo("Usage: xsltr.js file.xml file.xsl output.txt");
        WScript.Quit(1);
    }
    else
    {
        var xml = args(0);
        var xsl = args(1);
        var out = args(2);

        var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
        var xslDoc = new ActiveXObject("Msxml2.DOMDocument.6.0");

        /* Create a binary IStream */
        var outDoc = new ActiveXObject("ADODB.Stream");
        outDoc.type = adTypeBinary;
        outDoc.open();

        if(xmlDoc.load(xml) == false)
        {
            throw new Error("Could not load XML document: " + xmlDoc.parseError.reason);
        }

        if(xslDoc.load(xsl) == false)
        {
            throw new Error("Could not load XSL document: " + xslDoc.parseError.reason);
        }

        xmlDoc.transformNodeToObject(xslDoc, outDoc);
        outDoc.SaveToFile(out, adSaveCreateOverWrite);
    }
}
catch(e)
{
    WScript.Echo(e.message);
    WScript.Quit(1);
}

msxsl を使用できない理由はまだありますか? MSXML のバージョン 4.0 は標準インストールされたことがないため、常に手動でインストールする必要がありました (ただし、ある時点で Office に付属していたと思います)。処理を実行する必要があるマシンにバージョン 4 をデプロイできませんか?

于 2010-01-13T18:02:35.643 に答える