XSLT で XDocument を変換する


オリジナルの XML ではなく, XSLT で変換済みの XML ファイルに対して LINQ to XML したい場合があると思います。

let transform (xslt : string) (document : XDocument) =
   let transformer = XslCompiledTransform ()
   transformer.Load (xslt)
   let builder = StringBuilder ()
   use writer = XmlWriter.Create (builder, transformer.OutputSettings)
   use reader = document.CreateReader ()
   transformer.Transform (reader, writer)
   builder.ToString () |> XDocument.Parse

通常だと XDocument.Load xml |> fun doc -> doc.Descendants ... とするところを XDocument.Load xml |> transform xslt |> fun doc -> doc.Descendants ... のような感じでパイプして使うことができます。