有没有更有效的方法来转换已经包含对XSLT的引用的XDocument?

时间:2011-12-01 18:54:17

标签: c# xml xslt .net-4.0 xslcompiledtransform

我有一个XML文件,其中已经包含对XSLT文件的引用。

我正在考虑根据引用的转换规则转换此XML文件,以便我可以创建一个漂亮的PDF文件。

我似乎可以通过System.Xml.Xsl.XslCompiledTransform执行实际转换,但它要求我在执行转换之前手动关联XSLT。

基于我所看到的,我现在必须手动从XDocument中提取XSLT引用(下面粗略开始):

xmlDocument.Document.Nodes()
   .Where(n => n.NodeType == System.Xml.XmlNodeType.ProcessingInstruction)

但是,由于XSLT已经在XML文件本身中引用,我认为我做了太多工作,并且有一种更有效的方式来应用转换。

是否存在,或者这是人们必须做的事情?

2 个答案:

答案 0 :(得分:1)

没有更有效的方法可以做到这一点。在转换之前,您必须从xml中检索href到xslt。

类似的问题:XslTransform with xml-stylesheet

答案 1 :(得分:0)

我编写了以下运行时扩展来帮助实现这一点。 我尚未在xml中使用参考xsl进行测试,但是否则应该很好。

<Runtime.CompilerServices.Extension()>
Public Function XslTransform(XDocument As XDocument, xslFile As String) As XDocument
    If String.IsNullOrWhiteSpace(xslFile) Then
        Try
            Dim ProcessingInstructions As IEnumerable(Of XElement) = From Node As XNode In XDocument.Nodes
                                                                     Where Node.NodeType = Xml.XmlNodeType.ProcessingInstruction
                                                                     Select Node
            xslFile = ProcessingInstructions.Value
        Catch ex As Exception
            ex.WriteToLog(EventLogEntryType.Warning)
        End Try
    End If
    XslTransform = New XDocument
    Try
        Dim XslCompiledTransform As New Xml.Xsl.XslCompiledTransform()
        XslCompiledTransform.Load(xslFile)
        Using XmlWriter As Xml.XmlWriter = XslTransform.CreateWriter
            Using XMLreader As Xml.XmlReader = XDocument.CreateReader()
                XslCompiledTransform.Transform(XMLreader, XmlWriter)
                XmlWriter.Close()
            End Using
        End Using

        Return XslTransform
    Catch ex As Exception
        ex.WriteToLog
        XslTransform = New XDocument()
        Throw New ArgumentException("XDocument failted to transform using " & xslFile, ex)
    End Try
End Function