0

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

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

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

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

我知道 SAX 是基于推送的,因此返回的成本很高。但是,希望对这里涉及的成本和算法有更多的了解。

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

4

2 回答 2

1

我怀疑你的意思是parent::node() is /test。也就是说,您是否想知道父节点是否与 /test 节点相同。那将是一个非常快速的测试。但是使用“=”很慢:它形成了 parent::node() 的字符串值和 /test 的字符串值,并将它们作为字符串进行比较。/test 的字符串值是文档中所有文本节点的连接,因此它涉及搜索整个文档并构建一个可能非常大的字符串。

于 2013-10-23T13:08:44.843 回答
0

我会测试祖先的数量。像您这样的节点比较是比较树中的所有内容。如果您只对二级节点感兴趣(而不是整个树等于另一棵树),那么我会期望类似:

<xsl:when test="count(ancestor::node()) = 2"/>

或者更好的性能是

<xsl:when test="count(parent::node() | /test = 1)"/>

会更好。只是我的猜测。

于 2013-10-23T06:45:21.580 回答