【问题标题】:F# execute XSL Transform from XML String and returns stringF# 从 XML 字符串执行 XSL 转换并返回字符串
【发布时间】:2021-08-07 12:15:29
【问题描述】:

查看 .NET 中的 XSLCompiledTransform 类,试图找到一种在 F# 中使用它的简洁方法。我不熟悉字符串读取器/写入器,但我将其视为完成此任务的主要方法。还是我想要 XML 阅读器?

我有一个函数,它接受两个参数——一个 XML 字符串和一个 XSLT 样式表。我想返回一个 XML 字符串。

let applyXSLTransform xml xslFile =        
        let xslt = XslCompiledTransform()
        xslt.Load(xslFile)
        xslt.Transform(xml, outputToString); //This bit

处理文件很好也很容易,但似乎更多地涉及读取和写入字符串。我看过一些 C# 示例,但没有立即成功让它们工作,所以仍在对读者和作者进行研究!

干杯

【问题讨论】:

标签: xslt f# xslcompiledtransform


【解决方案1】:

我认为没有比使用XmlReaderXmlWriter 接口更简单的方法来使用API​​。不幸的是,这很乏味,但以下应该可以解决问题:

open System.IO
open System.Text
open System.Xml
open System.Xml.Xsl

let applyXSLTransform xml (xslFile:string) =        
  let xslt = XslCompiledTransform()
  let sbuilder = StringBuilder()
  use swriter = new StringWriter(sbuilder)
  use sreader = new StringReader(xml)
  use xreader = new XmlTextReader(sreader)
  use xwriter = new XmlTextWriter(swriter)
  xslt.Load(xslFile)
  xslt.Transform(xreader, xwriter)
  sbuilder.ToString()

代码构造StringBuilder,这是一个用于构造字符串的内存对象。它将StringWriterXmlTextWriter 包裹起来,传递给Transform 方法。最后,您使用ToString 方法读取StringBuilder 的内容。类似的事情发生在为来自 StringReader 的数据创建 XmlTextReader,其中包含您的输入 XML。

【讨论】:

  • 这很好用并标记为已接受,因为它也处理文件加载,尽管你和 Martin 的功能相同,我喜欢这两种解决方案。无论如何,这不是我在 F# 学习中遇到的最乏味的事情!
【解决方案2】:

这是我能想到的,尝试使用推荐的 XmlReader.Create 工厂方法而不是 .NET 1 旧版 XmlTextReader:

open System
open System.Xml.Xsl
open System.Xml
open System.IO

let transform xml xslt =
    let processor = XslCompiledTransform()

    use xsltreader = XmlReader.Create(new StringReader(xslt))

    processor.Load(xsltreader)

    use xmlreader = XmlReader.Create(new StringReader(xml))
    
    use resultwriter = new StringWriter()

    processor.Transform(xmlreader, null, resultwriter)

    resultwriter.ToString()

但我对F#没有深入了解,只是尝试将我的C#编码方式转换为F#。

【讨论】:

  • 据我所知,这很好用,“使用”是我不熟悉的 C# 构造,所以不知道如何翻译它。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 2017-11-29
  • 2014-06-11
  • 2018-04-30
  • 1970-01-01
  • 2016-02-05
  • 2020-03-15
相关资源
最近更新 更多