6

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

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

看来我可以通过 执行实际的转换System.Xml.Xsl.XslCompiledTransform,但它要求我在执行转换之前手动关联 XSLT。

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

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

但是,由于 XML 文件本身已经引用了 XSLT ,我认为我做的工作太多,并且有一种更有效的方法来应用转换。

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

4

2 回答 2

1

没有更有效的方法可以做到这一点。在转换之前,您必须从 xml 中检索到 xslt 的 href。

类似的问题:XslTransform with xml-stylesheet

于 2011-12-02T09:52:45.283 回答
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
于 2019-10-16T20:44:34.980 回答