Est-il un moyen plus efficace de transformer un XDocument qui contient déjà une référence à un XSLT?

StackOverflow https://stackoverflow.com/questions/8346715

Question

J'ai un fichier XML qui contient déjà une référence à un fichier XSLT.

Je regarde convertir ce fichier XML, selon les règles de transformation référencées, afin que je puisse ensuite créer un joli fichier PDF.

Il semble que je peux effectuer la transformation réelle via System.Xml.Xsl.XslCompiledTransform, mais il faut que j'associer manuellement un XSLT avant j'effectuer la transformation.

D'après ce que je l'ai vu, je dois maintenant tirer manuellement la référence XSLT à partir du XDocument (début ci-dessous brut):

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

Cependant, étant donné que le XSLT est déjà référencé dans le fichier XML lui-même, je suppose que je fais trop de travail, et il y a un moyen d'appliquer la transformation de plus efficace.

Y at-il, ou est-ce ce que l'on doit faire?

Était-ce utile?

La solution

Il n'y a pas moyen plus efficace de le faire. Vous devez récupérer href xslt de votre XML avant de le transformer.

Une question similaire ici: XslTransform avec xml-stylesheet

Autres conseils

J'ai écrit l'extension d'exécution ci-dessous pour aider. Je ne l'ai pas testé à l'aide encore xsl de référence dans le fichier XML, mais sinon il serait bon.

<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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top