Есть ли более эффективный способ преобразования XDocument, который уже содержит ссылку на XSLT?

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

Вопрос

У меня есть файл XML, который уже содержит ссылку на файл XSLT.

Я собираюсь преобразовать этот XML-файл в соответствии с указанными правилами преобразования, чтобы затем создать хороший PDF-файл.

Похоже, что я могу выполнить фактическое преобразование через System.Xml.Xsl.XslCompiledTransform, но для этого требуется вручную связать XSLT перед выполнением преобразования.

Основываясь на том, что я увидел, теперь мне нужно вручную извлечь ссылку XSLT из XDocument (грубое начало ниже):

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

Однако, поскольку XSLT уже указанный в самом XML-файле, я предполагаю, что выполняю слишком много работы, и есть более эффективный способ применить преобразование.

Есть ли это, или это то, что нужно делать?

Это было полезно?

Решение

Более эффективного способа сделать это не существует.Вам необходимо получить href в xslt из вашего xml перед его преобразованием.

Аналогичный вопрос здесь: XslTransform с таблицей стилей xml

Другие советы

Я написал следующее расширение времени выполнения, чтобы помочь с этим. Я еще не тестировал, используя эталонный XSL в XML, но в остальном это должно быть хорошо.

<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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top