F# 从 XML 字符串和 returns 字符串执行 XSL 转换

F# execute XSL Transform from XML String and returns string

查看 .NET 中的 XSLCompiledTransform Class 试图找到一种在 F# 中使用它的简洁方法。我不熟悉 string readers/writers 但我将其视为实现此目的的主要方法。还是我想要 XML 个读者?

我有一个接受两个参数的函数 - XML 字符串和 XSLT 样式表。我要return一串XML.

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

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

干杯

我认为使用 API 没有比使用 XmlReaderXmlWriter 界面更简单的方法了。不幸的是,这非常乏味,但以下应该可以解决问题:

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.

这是我能想出的,尝试使用推荐的 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#。