我有一些将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的传统机器。
我如何写这个以便它可以在两种环境中工作?
答案 0 :(得分:2)
避免使用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();
}
}
}
现在在项目属性Debug选项卡中添加三个命令行参数,输入XML的文件路径,转换它的XSLT文件和输出文件路径。
现在,您可以在更大的.NET项目中使用它,该项目可以使用专为ASP Classis和/或包含旧的MS脚本代码而使用的XSL。