引用XML中的父节点,而XSLT大大降低了性能

时间:2013-10-22 10:32:38

标签: xslt xml-parsing sax saxon

在进行XSLT优化时,我发现通过避免父节点查找,XSLT运行持续时间从1小时减少到大约20秒。

我只是通过传递相关参数来避免低于xsl线,以采取所需的决定并且性能得到提升。

<xsl:if test="parent::node() = /test">
...
</xsl:if>

我正在使用saxon8.jar库来执行使用基于SAX的XML解析的XSLT。

据我所知,SAX是基于推送的,所以回头费用很高。但是,想要更深入地了解这里涉及的成本和算法。

另外,在我的XSL中,我在不同的执行步骤中使用Xpath多次引用相同的前向节点。那么,为什么这不会像引用父节点那样变成瓶颈呢?

2 个答案:

答案 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)"/>

会更好。只是我的猜测。