XSLT document() :多次调用时是否会变慢?

发布于 2024-11-06 15:05:52 字数 755 浏览 1 评论 0原文

2013 年 7 月 17 日更新
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"/>

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

UPDATE 17.Jul.2013:
XALAN 2.7 does not cache document() calls within a request. So it is crucial to store each needed document in a variable in the XSL.


I have searched for quite a while and didn't find concrete answers to my simple question:

Which approach is faster or is the compiler "smart" enough so that both variants are the same?

Note: I am using Xalan 2.7 (default implementation in JDK 1.6):

1) I have to read a property in an external XML:

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

Whenever I need the city, I use the expression above (let's say 100 times)

2) Instead of calling the document() 100 times, I store the XML node in a variable:

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

And then I use 100 times

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

Which one is faster, better, for which reasons?
Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

半衬遮猫 2024-11-13 15:05:53

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

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

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

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

然后仅参考 $vCities

这样你只遍历了文档一次。

Both methods should execute for the same time if an XSLT processor is not naive, because the document function should return the same result when it is called with the same argument(s), no matter how many times.

Both methods are not efficient, because of the use of the // abbreviation, which causes the whole document tree to be traversed.

I would recommend the following as more efficient than both methods are being discussed:

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

then only reference $vCities.

In this way you have traversed the document only once.

回眸一遍 2024-11-13 15:05:53

看来你已经明白其中的原理了,所以不需要任何解释。

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

正如 @Dimitre 指出的那样,由于 // 的原因,这些方法都不一定有效,尽管某些处理器很聪明地优化了这些类型的路径,从而缓解了问题。您可以通过将 city 元素保留在变量中来帮助处理器提高效率:

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

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

It seems that you understand the principles involved, so you don't need any explanations there.

If you want to know how Xalan 2.7 does it, the definitive answer will be found by testing it with Xalan 2.7, with a large enough test.

As @Dimitre noted, neither one of these is necessarily efficient, because of the //, though some processors are smart about optimizing those kinds of paths, mitigating the problem. You could help the processor be more efficient by keeping the city element in a variable:

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

I added [1] in there for further optimization because you said "the city" (i.e. you expect only one), and this allows a smart processor to stop after it finds the first city element.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文