¿Existe una forma más eficiente de transformar un XDocument que ya contiene una referencia a un XSLT?
-
27-10-2019 - |
Pregunta
Tengo un archivo XML que ya contiene una referencia a un archivo XSLT.
Estoy buscando convertir este archivo XML, de acuerdo con las reglas de transformación referenciadas, para que luego pueda crear un buen archivo PDF.
Parece que puedo realizar la transformación real a través de System.Xml.Xsl.XslCompiledTransform
, pero requiere que asocie manualmente un XSLT antes de realizar la transformación.
Según lo que he visto, ahora debo extraer manualmente la referencia XSLT del XDocument (inicio aproximado a continuación):
xmlDocument.Document.Nodes()
.Where(n => n.NodeType == System.Xml.XmlNodeType.ProcessingInstruction)
Sin embargo, ya que el XSLT es ya Referenciado en el archivo XML en sí, supongo que estoy haciendo demasiado trabajo, y hay una forma más eficiente de aplicar la transformación.
¿Hay esto, o es esto lo que tiene que hacer?
Solución
No hay una forma más eficiente de hacerlo. Tienes que recuperar href a XSLT de tu XML antes de transformarlo.
Pregunta similar aquí: XSLTransform con hoja de estado XML
Otros consejos
Escribí la siguiente extensión de tiempo de ejecución para ayudar con esto. Todavía no he probado un XSL de referencia en el XML, pero de lo contrario debería ser bueno.
<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