8

更新 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"/>

哪个更快,更好,出于哪些原因?谢谢!

4

2 回答 2

3

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

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

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

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

那么只能参考 $vCities

这样,您只遍历了文档一次。

于 2011-05-10T13:42:23.553 回答
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元素后停止。

于 2011-05-10T15:35:51.793 回答