XSLT document():多次调用它会慢吗?

时间:2011-05-10 07:33:26

标签: java xml xslt xalan

更新17.Jul.2013
XALAN 2.7 不会在请求中缓存 document()个调用。因此,将每个所需文档存储在XSL中的变量中至关重要。


我已经搜索了很长一段时间,并没有找到我的简单问题的具体答案:

哪种方法更快或者编译器是否“足够”以便两种变体都相同?

注意:我使用的是 Xalan 2.7 (JDK 1.6中的默认实现):

1)我必须在外部XML中读取属性:

<xsl:value-of select="document($path)/person/address/city"/>

每当我需要这个城市时,我都会使用上面的表达式(让我们说100次)

2)我没有调用document()100次,而是将XML节点存储在变量中:

<xsl:variable name="node" select="document($path)"/>

然后我用了100次

<xsl:value-of select="$node/person/address/city"/>

哪一个更快,更好,原因是什么? 谢谢!

2 个答案:

答案 0 :(得分:3)

如果XSLT处理器不是天真的,两个方法应该同时执行,因为当使用相同的参数调用文档函数时,它应返回相同的结果,无论如何多次。

这两种方法效率都不高,因为使用了//缩写,导致整个文档树被遍历。

我建议以下内容比正在讨论的两种方法更有效:

<xsl:variable name="vCities" select="document($pUrl)//cities"/>

然后只引用 $vCities

通过这种方式,您只遍历了一次文档。

答案 1 :(得分:2)

您似乎理解所涉及的原则,因此您不需要任何解释。

如果您想知道Xalan 2.7是如何做到的,那么通过使用Xalan 2.7进行测试,可以找到明确的答案。测试结果足够大。

正如@Dimitre指出的那样,由于//,这些都不一定是有效的,尽管有些处理器非常聪明地优化这些路径,从而减轻了问题。通过将city元素保存在变量中,可以帮助处理器提高效率:

<xsl:variable name="city" select="(document($path)//city)[1]"/>
...
<xsl:value-of select="$city"/>

我在其中添加了[1]以进一步优化,因为您说“城市”(即您只期望一个),这允许智能处理器在找到第一个city元素后停止。