我有一个使用XSLT1的实时应用程序,我想升级到XSLT2。 目前我正在使用microsoft xslt1引擎,该引擎在0.1秒内执行特定的xml和xsl。
对于XSLT2转换,我创建了一个使用XQSharp执行xslt2转换的函数。我使用了相同的xml和xsl,转换耗时0.9秒。
我分析了我的代码,结果发现超过90%的处理时间是由这一行引起的:
Dim query As Xslt = Xslt.Compile(New StringReader(inputXsl),querySettings)
我的问题是有办法加快这个过程吗?
例如通过更改一些querySettings?
我的完整代码
<WebMethod()> _
Public Function XSLTXQSharp(ByVal inputXml As String, ByVal inputXsl As String) As String
Dim nameTable As XmlNameTable = New NameTable()
Dim xmlReaderSettings As New XmlReaderSettings()
xmlReaderSettings.NameTable = nameTable
Dim document As XdmDocument
Using reader As New StringReader(inputXml)
Using xmlReader As XmlReader = xmlReader.Create(reader, xmlReaderSettings)
document = New XdmDocument(xmlReader)
End Using
End Using
Dim querySettings As New XsltSettings(nameTable)
querySettings.ContextItemType = XdmType.Node
querySettings.ModuleResolver = New XmlUrlResolver()
''' SLOW!!! more then 90 % of execution time
Dim query As Xslt = Xslt.Compile(New StringReader(inputXsl), querySettings)
Dim contextItem As XPathNavigator = document.CreateNavigator()
Dim result As Stream = New MemoryStream()
query.ApplyTemplates(contextItem, result)
'Return dt2.Subtract(dt1).ToString()
result.Position = 0
Using reader As StreamReader = New StreamReader(result)
Return reader.ReadToEnd()
End Using
End Function
答案 0 :(得分:1)
尝试更改优化级别。它是静态上下文设置的属性。看到你想要编译的转换会很有帮助。
请注意,Microsoft编译器非常快,并且它编译为字节代码。 XQSharp倾向于使用更复杂的样式表获胜,或者XSLT 2.0功能(例如for-each-groups)正在替换XSLT 1.0中的键的使用。
答案 1 :(得分:0)
您可能会发现需要使用特定于XQSharp的论坛。
这是一个大型复杂样式表用于转换小型源文档的情况吗?
您是否无法分摊编译样式表的成本,然后将结果缓存以用于许多转换?通常,开发人员会假设在编译过程中花费时间来优化代码,如果它可以减少运行时执行时间 - 这似乎与编写此工作负载的方式不同。
从纯粹自私的角度来看,我很想知道数字与撒克逊人的比较。