是否有更有效的方法来转换已经包含对 XSLT 的引用的 XDocument?

问题描述 投票:0回答:3

我有一个 XML 文件,其中已经包含对 XSLT 文件的引用。

我正在考虑根据引用的转换规则转换这个 XML 文件,这样我就可以创建一个漂亮的 PDF 文件。

看来我可以通过

System.Xml.Xsl.XslCompiledTransform
执行实际转换,但它要求我在执行转换之前手动关联一个XSLT。

根据我所见,我现在必须手动从 XDocument 中提取 XSLT 引用(下面是粗略的开始):

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

但是,由于 XSLT already 在 XML 文件本身中被引用,我假设我做了太多的工作,并且有一种更有效的方法来应用转换。

有没有,或者这是一个人必须做的?

c# xml xslt .net-4.0 xslcompiledtransform
3个回答
1
投票

没有比这更有效的方法了。在转换它之前,您必须从 xml 中检索到 xslt 的 href。

这里有类似的问题:XslTransform with xml-stylesheet


0
投票

我编写了以下运行时扩展来帮助解决这个问题。 我还没有在 xml 中使用引用 xsl 进行测试,但除此之外它应该很好。

<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

0
投票

如果您要使用 Saxon XSLT 处理器而不是 Microsoft 处理器,则可以使用方法

XsltCompiler.CompileAssociatedStylesheet()
.

© www.soinside.com 2019 - 2024. All rights reserved.