【发布时间】:2011-08-22 05:54:00
【问题描述】:
UPDATE 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"/>
哪个更快、更好,原因是什么? 谢谢!
【问题讨论】:
-
我也对专家的回答很感兴趣,但是,我认为,多次调用
document(path_to_doc)的情况取决于 xslt 处理器缓存实现,在这种情况下,当文档节点存储在在任何情况下都必须加载一次的变量。 -
是的,我也猜想它取决于处理器的实现,但我很好奇Xalan 2.7(JDK 1.6 中的默认处理器)是如何实现的 b> 做到了。
-
我不是 100% 肯定的,但我认为 Xalan 不会缓存
document()结果,但 xsltproc 会。然而,document()参数被解释为一个 URI (see spec),因此积极的缓存将非常有意义。 -
好问题,+1。有关第三种更有效解决方案的解释和建议,请参阅我的答案。
-
使用 XALAN 2.7 测试:每个
document()调用都将被执行并包括物理文件访问。所以至少对于 XALAN 2.7 来说,将文档存储在变量中是很有意义的。我用测试结果更新了我的问题。