我有一些旧版 XSLT 脚本,其中包含了 VBScript。它们在旧系统上运行,我无法更改该系统。
我现在需要对 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 来执行转换。这样,在 .NET 中托管执行的转换更有可能在经典 ASP 中执行转换时执行相同的操作。
Edit:
Example.
创建 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 Classic 使用而设计的 XSL 和/或包含较旧的 MS 脚本代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)