3

VBScriptを組み込んだレガシーXSLTスクリプトがいくつかあります。それらは古いシステムで実行されており、そのシステムを変更することはできません。

ファイルを別の方法で変換するには、XSLTに変更を加える必要があります。

XSLT変換をテストするための単純な.NETプロジェクトを作成しました。

    [STAThread]
    public static void Main(string[] args)
    {
        var transform = new XslCompiledTransform(true);
        //foreach (var file in System.Reflection.Assembly
        //    .GetExecutingAssembly().GetManifestResourceNames()
        //    )
        //{
        //    Console.WriteLine(file);
        //}
        //Console.ReadKey();


        transform.Load(XmlTextReaderFromEmbeddedResource("MyXSLTFile"),
            new XsltSettings() { EnableDocumentFunction = true, EnableScript = true }, new XmlUrlResolver());
        transform.Transform(
            XmlTextReaderFromEmbeddedResource("MySourceXML"),
            ToXmlTextWriter("MyOutput.xml"));

    }

    private static XmlTextReader XmlTextReaderFromEmbeddedResource(string resourceName)
    {
        var resource = typeof(Transform)
            .Assembly.GetManifestResourceStream
            (resourceName);
        return new XmlTextReader(resource);
    }

    private static XmlTextWriter ToXmlTextWriter(string fileName)
    {
        return new XmlTextWriter(fileName, Encoding.UTF8);
    }

これは、手続き的に機能します。ただし、VBScriptであるXSLTのスクリプトは、.NETではうまく機能していません。具体的には、次のセグメントがあります。

dim gRegEx
set gRegEx = New RegExp

これは、変換を次のように爆撃します。

Type 'RegExp' is not defined.

これを.NETオブジェクトに変換する方法については多くの記事がありますが、これはVBScriptを期待するレガシーマシンに戻す必要があります。

両方の環境で機能するようにこれを作成するにはどうすればよいですか?

4

1 に答える 1

2

の使用を避けるための最も簡単なアプローチXslCompiledTransform。代わりに、COM-Interopを使用してMSXML3またはMSXML6を利用して変換を実行します。そうすれば、.NETでホストされて実行される変換が、従来のASPで実行されるときに同じように実行される可能性がはるかに高くなります。

編集

例。

WindowsコンソールC#プロジェクトを作成する

COMコンポーネント名「MicrosoftXML、v3.0」への参照を追加します。

このコードを含めます:-

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var dom = new MSXML2.DOMDocument30();
            dom.async = false;
            dom.load(args[0]);

            var xslt = new MSXML2.DOMDocument30();
            xslt.async = false;
            xslt.load(args[1]);

            File.WriteAllText(args[2], dom.transformNode(xslt));

            Console.WriteLine("Done");

        }
        finally
        {
            Console.ReadKey();
        }
    }

}

次に、プロジェクトのプロパティの[デバッグ]タブで、3つのコマンドラインパラメーター、入力XMLへのファイルパス、変換するXSLTファイル、および出力ファイルパスを追加します。

これを、ASP Classisで使用するために設計されたXSLを利用できる、および/または古いMSスクリプトコードを含む、より大きな.NETプロジェクトに組み込むことができるようになりました。

于 2012-04-12T16:25:03.673 に答える