我有一个 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 文件本身中被引用,我假设我做了太多的工作,并且有一种更有效的方法来应用转换。
有没有,或者这是一个人必须做的?
没有比这更有效的方法了。在转换它之前,您必须从 xml 中检索到 xslt 的 href。
这里有类似的问题:XslTransform with xml-stylesheet
我编写了以下运行时扩展来帮助解决这个问题。 我还没有在 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
如果您要使用 Saxon XSLT 处理器而不是 Microsoft 处理器,则可以使用方法
XsltCompiler.CompileAssociatedStylesheet()
.