C# 如何使用Saxon api进行转换

C# 如何使用Saxon api进行转换,c#,xml,xslt-2.0,saxon,C#,Xml,Xslt 2.0,Saxon,我使用的是萨克森9.8。我想用C#编写一个转换函数,如下所示 `using Saxon.Api; private string Transform(Stream xmlStream, string transform) { }` 请帮我填写此函数我认为您至少应该尝试自己编写代码,当您陷入困境时,请在internet上查找可能的答案。只有当你不能用这种方式解决我们的问题时,你才会问一个具体的问题。我不会为你写你的全部代码。但我可以在这里分享如何使用Saxon API进行X

我使用的是萨克森9.8。我想用C#编写一个转换函数,如下所示

 `using Saxon.Api;
  private string Transform(Stream xmlStream, string transform)
    {

    }`

请帮我填写此函数

我认为您至少应该尝试自己编写代码,当您陷入困境时,请在internet上查找可能的答案。只有当你不能用这种方式解决我们的问题时,你才会问一个具体的问题。我不会为你写你的全部代码。但我可以在这里分享如何使用Saxon API进行XSLT转换:

    public static String TransfromXMLWithXSLT2(String i_xmlData, String i_xsltCode)
    {
        Processor xsltProcessor = new Processor();
        DocumentBuilder documentBuilder = xsltProcessor.NewDocumentBuilder();
        documentBuilder.BaseUri = new Uri("file://");
        XdmNode xdmNode = documentBuilder.Build(new StringReader(i_xmlData));

        XsltCompiler xsltCompiler = xsltProcessor.NewXsltCompiler();
        XsltExecutable xsltExecutable = xsltCompiler.Compile(new StringReader(i_xsltCode));
        XsltTransformer xsltTransformer = xsltExecutable.Load();
        xsltTransformer.InitialContextNode = xdmNode;

        using (StringWriter stringWriter = new StringWriter()) {
            Serializer serializer = new Serializer();
            serializer.SetOutputWriter(stringWriter);
            xsltTransformer.Run(serializer);
            return stringWriter.ToString();
        }
    }
我在转换类中使用了一个开关来支持XSLT1.0。对于XSLT1.0,我更喜欢.Net功能,只是为了了解您的信息,我的代码如下所示:

    public static String TransfromXMLWithXSLT1(String i_xmlData, String i_xsltCode)
    {
        XslCompiledTransform xslt = new XslCompiledTransform();

        using (StringReader xsltStringReader = new StringReader(i_xsltCode)) {
            using (XmlReader xsltXmlReader = XmlReader.Create(xsltStringReader)) {
                xslt.Load(xsltXmlReader);
                using (StringReader tableStringReader = new StringReader(i_xmlData)) {
                    using (XmlReader tableXmlReader = XmlReader.Create(tableStringReader)) {
                        using (StringWriter stringWriter = new StringWriter()) {
                            xslt.Transform(tableXmlReader, new XsltArgumentList(), stringWriter);
                            return stringWriter.ToString();
                        }
                    }
                }
            }
        }
    }

因此,如果您需要流/读取器而不是字符串,只需按需要的方式更改代码即可

这个函数到底应该做什么?如果要使用字符串
transform
中的XSLT转换输入
xmlStream
,为什么结果会是
XmlReader
?XmlReader可以作为转换的输入。请确保下载saxon资源文件,并查看使用此API的示例应用程序。@Martin Honen,返回XmlReader是我的应用程序需要的东西。没关系。返回一个字符串可以工作,但我需要在手动转换器中设置baseUri.SetInputStream(Stream input,Uri baseUri);我不知道这是干什么用的。我应该设置什么Uri?请参阅文档,它解释了“baseUri:主体输入文档的基本Uri。例如,如果文档包含以相对Uri形式指向其他文档的链接,则document()函数将使用该Uri”What is documentBuilder.baseUri=新Uri(“file:///C:/"); 对于它是强制性的吗?如果我不需要呢?好问题!这是强制性的,但我不知道为什么。我想这是因为萨克森特别适合处理文件。通常,DocumentBuilder会在系统上创建新文档。我只是用它为XsltTransformer创建一个XdmNode。但它似乎足以纠正新的Uri(“文件:/”)。在其他blog to=>中看到了这一点,在从nuget添加(使用:安装软件包Saxon HE-Version 9.8.0.15)后,函数帮助了我