使用XSLT版本2进行XML转换

时间:2016-07-14 14:06:13

标签: c# c#-4.0 xslt-2.0

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

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

后来我才知道微软并不支持XSLT 2.0版。 请参阅link。它建议使用一些第三方工具。但这些工具有一些许可费用。有没有类似的免费软件?

[编辑]

我试图使用SaxonHe

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

它无法在最后一个语句中提供空引用异常。实际上,destination.XmlDocument正在获取空值。

1 个答案:

答案 0 :(得分:0)

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

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


    }
}