Est-il un moyen plus efficace de transformer un XDocument qui contient déjà une référence à un XSLT?
-
27-10-2019 - |
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?
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