我有一个XML文件,其中已经包含对XSLT文件的引用。
我正在考虑根据引用的转换规则转换此XML文件,以便我可以创建一个漂亮的PDF文件。
我似乎可以通过System.Xml.Xsl.XslCompiledTransform
执行实际转换,但它要求我在执行转换之前手动关联XSLT。
基于我所看到的,我现在必须手动从XDocument中提取XSLT引用(下面粗略开始):
xmlDocument.Document.Nodes()
.Where(n => n.NodeType == System.Xml.XmlNodeType.ProcessingInstruction)
但是,由于XSLT已经在XML文件本身中引用,我认为我做了太多工作,并且有一种更有效的方式来应用转换。
是否存在,或者这是人们必须做的事情?
答案 0 :(得分:1)
没有更有效的方法可以做到这一点。在转换之前,您必须从xml中检索href到xslt。
答案 1 :(得分: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