【问题标题】:How to Transform using Saxon-api如何使用 Saxon-api 进行转换
【发布时间】:2017-11-13 07:16:01
【问题描述】:

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

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

    }`

请帮我填写这个函数

【问题讨论】:

  • 该函数到底应该做什么?如果您想用字符串transform 中的XSLT 转换输入xmlStream,为什么结果会是XmlReader? XmlReader 可以作为转换的输入。
  • 确保您下载了 saxon-resources 文件并查看使用此 API 的示例应用程序。
  • @Martin Honen,返回一个 XmlReader 是我想要的应用程序。没关系。返回一个字符串有效,但我在他们的手动转换器中设置了一个 baseUri.SetInputStream(Stream input,Uri baseUri);我不知道这是为了什么。我要设置什么 Uri?
  • 参见文档saxonica.com/html/documentation/dotnetdoc/Saxon/Api/…,它解释了“baseUri:主要输入文档的基本 URI。例如,如果文档包含指向其他文档的链接,则由 document() 函数使用相对 URI 的形式"

标签: c# xml xslt-2.0 saxon


【解决方案1】:

我认为您至少应该尝试自己编写代码,当您遇到困难时,请在互联网上寻找可能的答案。只有当您无法以这种方式解决我们的问题时,才提出特定问题。我不会为你编写整个代码。但我可以在这里分享我是如何使用 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();
                        }
                    }
                }
            }
        }
    }

因此,如果您需要 Streams/Readers 而不是 Strings,只需按照需要的方式更改代码!

【讨论】:

  • 什么是documentBuilder.BaseUri = new Uri("file:///C:/");为了?它是强制性的吗?如果我不需要它怎么办?
  • 好问题!这是强制性的,但我不知道为什么。我想这是因为 Saxon 是专门为处理文件而设计的。通常 DocumentBuilder 在您的系统上创建一个新文档。把我只用它来为 XsltTransformer 创建一个 XdmNode。但是对 new Uri("file://") 似乎已经足够了。在其他博客中看到这个 => stackoverflow.com/questions/16101213/…
  • saxonica.plan.io/boards/3/topics/7029有一些关于这个问题的讨论
  • 从 nuget 添加后(使用:Install-Package Saxon-HE -Version 9.8.0.15),功能帮了我
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2021-10-05
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多