使用 XSLT 版本 2 进行 XML 转换

本文关键字:XML 转换 进行 XSLT 版本 使用 | 更新日期: 2023-09-27 17:56:53

我正在尝试使用 XSLT 版本 2.0 转换 XML,但出现以下异常:

找不到与命名空间"http://www.w3.org/2001/XMLSchema"关联的脚本或扩展对象。

后来我才知道Microsoft不支持XSLT版本2.0。请参阅链接。它建议使用一些第三方工具。但是这些工具需要支付一些相关的许可费。有没有类似的免费软件可用?

[编辑]

我尝试使用撒克逊人

  public static void Func( string xsltFile,string inputFile, string outputFile)
    {
        var  xslt = new FileInfo(xsltFile);
        var input = new FileInfo(inputFile);
        var output = new FileInfo(outputFile);
        // Compile stylesheet
        var processor = new Processor(false);
        var compiler = processor.NewXsltCompiler();
        var executable = compiler.Compile(new Uri(xslt.FullName));

        // Do transformation to a destination
        var destination = new DomDestination();
        using (var inputStream = input.OpenRead())
        {
            var transformer = executable.Load();
            transformer.SetInputStream(inputStream, new Uri(input.DirectoryName));
            transformer.Run(destination);
        }
        destination.XmlDocument.Save(output.FullName);
    }

在最后一条语句上给出空引用异常是行不通的。实际上是目的地。XmlDocument 正在获取空值。

使用 XSLT 版本 2 进行 XML 转换

我认为如果您想简单地将转换结果创建为文件,那么您不需要 DomDestination,您可以使用序列化程序,如

    static void Main(string[] args)
    {
        TestTransform("XSLTFile1.xslt", "XMLFile1.xml", "Result1.xml");
    }
    public static void TestTransform(string xsltFile, string inputFile, string outputFile)
    {
        var xslt = new FileInfo(xsltFile);
        var input = new FileInfo(inputFile);
        var output = new FileInfo(outputFile);
        // Compile stylesheet
        var processor = new Processor(false);
        var compiler = processor.NewXsltCompiler();
        var executable = compiler.Compile(new Uri(xslt.FullName));

        using (var inputStream = input.OpenRead())
        {
            var transformer = executable.Load();
            transformer.SetInputStream(inputStream, new Uri(input.DirectoryName));
            var serializer = new Serializer();
            using (var resultStream = output.OpenWrite())
            {
                serializer.SetOutputStream(resultStream);
                transformer.Run(serializer);
            }
        }

    }
}