【问题标题】:Using asp objects in .NET - Max compatibility在 .NET 中使用 asp 对象 - 最大兼容性
【发布时间】:2012-04-12 15:16:04
【问题描述】:

我有一些在其中包含 VBScript 的旧版 XSLT 脚本。它们在旧系统上运行,我无法更改该系统。

我现在需要对 XSLT 进行更改才能以不同的方式转换文件。

我构建了一个简单的 .NET 项目来测试我的 XSLT 转换:

    [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);
    }

这在程序上有效。但是,XSLT 中的脚本(即 VBScript)不能很好地与 .NET 配合使用。具体来说,我有一段:

dim gRegEx
set gRegEx = New RegExp

将变换轰炸为:

Type 'RegExp' is not defined.

有很多关于如何将其转换为 .NET 对象的文章,但这需要回到期待 VBScript 的旧机器。

我该如何编写它以使其在两种环境中都能正常工作?

【问题讨论】:

    标签: c# xslt asp-classic vbscript


    【解决方案1】:

    避免使用XslCompiledTransform 的最简单方法。而是使用 COM-Interop 来利用 MSXML3 或 MSXML6 来执行转换。这样,当在经典 ASP 中执行转换时,托管在 .NET 中执行的转换更有可能执行相同的操作。

    编辑

    示例。

    创建一个 Windows 控制台 C# 项目

    添加对 COM 组件名称“Microsoft XML, 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();
            }
        }
    
    }
    

    现在在项目属性“调试”选项卡中添加三个命令行参数,输入 XML 的文件路径,转换它的 XSLT 文件和输出文件路径。

    您现在可以将其合并到一个更大的 .NET 项目中,该项目可以利用为 ASP Classis 设计的 XSL 和/或包含旧的 MS 脚本代码。

    【讨论】:

    • 除了 Anthony 建议的内容(在 .NET 4.0 中,您可能可以通过 dynamic C# 和 CLR 支持轻松使用 MSXML),我想指出,尽管它的名称为 @987654324 XslCompiledTransform 中的 @ 不支持 VBScript,它支持的只是 VB.NET,以及动态编译的其他 .NET 语言,如 C# 或 JScript.NET。
    • 你能提供一个小例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多