Есть ли более эффективный способ преобразования XDocument, который уже содержит ссылку на XSLT?
-
27-10-2019 - |
Вопрос
У меня есть файл 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