更新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"/>
哪一个更快,更好,原因是什么? 谢谢!
答案 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
元素后停止。