在进行XSLT优化时,我发现通过避免父节点查找,XSLT运行持续时间从1小时减少到大约20秒。
我只是通过传递相关参数来避免低于xsl线,以采取所需的决定并且性能得到提升。
<xsl:if test="parent::node() = /test">
...
</xsl:if>
我正在使用saxon8.jar库来执行使用基于SAX的XML解析的XSLT。
据我所知,SAX是基于推送的,所以回头费用很高。但是,想要更深入地了解这里涉及的成本和算法。
另外,在我的XSL中,我在不同的执行步骤中使用Xpath多次引用相同的前向节点。那么,为什么这不会像引用父节点那样变成瓶颈呢?
答案 0 :(得分:1)
我怀疑你的意思是parent::node() is /test
。那,您想知道父节点是否与/ test节点是同一节点。那将是一个非常快速的测试。但是使用“=”很慢:它形成parent :: node()的字符串值和/ test的字符串值,并将它们作为字符串进行比较。 / test的字符串值是文档中所有文本节点的串联,因此它涉及搜索整个文档并构建一个可能非常大的字符串。
答案 1 :(得分:0)
我会测试一下祖先的数量。像您正在进行的节点比较是比较树中的所有内容。如果你只对二级节点感兴趣(而不是整棵树等于另一棵树)那么我会期待类似的东西:
<xsl:when test="count(ancestor::node()) = 2"/>
或者可能是更好的表现
<xsl:when test="count(parent::node() | /test = 1)"/>
会更好。只是我的猜测。