¿Existe una forma más eficiente de transformar un XDocument que ya contiene una referencia a un XSLT?

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

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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top