c# - 在 .NET 中使用 asp 对象 - 最大兼容性

标签 c# xslt asp-classic vbscript

我有一些在其中合并了 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 的旧机器上。

我如何编写它才能在两种环境中工作?

最佳答案

避免使用 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 脚本代码的 XSL。

关于c# - 在 .NET 中使用 asp 对象 - 最大兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10126541/

相关文章:

c# - 表单应该包含对象,还是对象包含表单?

c# - asp.net mvc 如何构造 Controller 以对多个条件进行排序

xml - XSLT:替换两个节点之间的文本

dll - 为经典 ASP 注册 COM 组件

asp-classic - 使用regsvr32注销COM dll

c# - 使用 dotnet run 命令运行时,带有 EF Core 的 .NET Core 控制台应用程序无法运行,抛出身份验证失败异常

c# - 在 C# 中从 mongodb 获取单个对象

xml - XSLT XML : highlight a search word in search results

css - 不显示父节点的子节点的 XML

asp-classic - 没有多线程的 ASP 经典 GET 请求