XSLT转换是使用Saxon提供的API通过点网络代码完成的。我正在使用Saxon 9家庭版API。 XSLT版本为2.0并生成xml输出。输入文件大小为123 KB。
XSLT根据特定方案向输入XML文件添加属性。此XLST共有7种模式。在一种模式中生成的属性值用于另一种模式,因此使用多种模式。
输出正确生成但执行此XSLT大约需要10秒。在“Altova XMLSpy 2013”中执行相同的XSLT时,大约需要3-4秒。
有没有办法进一步减少这10秒的执行时间?造成这么多时间的原因是什么?
XSLT可在以下链接下载。
答案 0 :(得分:0)
如果没有源文件来对抗(并因此进行测量),很难确定效率低下的地方,但乍一看最明显的是元素名称的奇怪测试。模式如:
match="*[name()='J' or name()='H' or name()='F' or name()='D' or name()='B' or name()='I' or name()='G' or name()='E' or name()='C' or name()='A' or name()='X' or name()='Y' or name()='O' or name()='K' or name()='L' or name()='M' or name()='N']
如果以自然的方式写作,撒克逊语中的效率会大大提高
match="J|H|F|D|B|I|G|E|C|A|X|Y|O|K|L|M|N"
它也更可能是正确的,因为将name()与字符串进行比较对所选前缀敏感,而XSLT代码确实应该适用于源文档作者选择的任何名称空间前缀。 / p>
后者更有效的原因是Saxon组织源树以按名称快速匹配元素(意思是命名空间URI加本地名称,不包括前缀)。当您以这种方式按名称匹配时,可以通过快速哈希表查找找到匹配的模板规则。如果使用必须通过将名称(带前缀)扩展为字符串并比较字符串来进行评估的谓词,则不仅每次比较需要更长时间,而且还无法通过哈希查找进行优化。