由于性能问题限制每个标准

时间:2012-11-02 13:45:53

标签: xslt

我有一些看起来像这样的代码:

<xsl:for-each select="($home/item[@key='issues']/item[@key='cwa']/item[@key='archives']/item[@key='2012']/*/*)">
    <xsl:if test="(position() &lt; 15) and (position() &gt; 1)">
    ...

它工作正常,除了结果集中有数百个项目,我只想显示20. 2012年下面的结构看起来像这样

2012
  01
  02
  03

所以理论上我只需要当月和上个月。有没有办法限制for-each语句本身?

这是在Sitecore CMS中,所以遗憾的是我无法轻松访问原始XML。

2 个答案:

答案 0 :(得分:0)

我已经获得了“模板 - 应用模板”构造更好的性能。我还有一个包含数百个项目的XML。在特定情况下,我不得不重命名元素,性能增益几乎是30秒。

另外由于其他原因,我建议使用“template - apply-templates”构造: For loops vs. apply-templates

我希望有所帮助。

我相信你也可以调整你的例子中的代码。你能提供一个源XML示例吗?

祝你好运, 彼得

答案 1 :(得分:0)

您还可以创建一个XSL扩展来填充foreach。在XSL扩展中,您可以使用Linq仅选择您真正需要的项目。

将数百个项目作为子项目的另一个缺点是,当您尝试打开父项目时,内容编辑器可能会变得非常慢。例如,每月将子项自动划分为文件夹可以解决这个问题(或者使用Lucene搜索索引尝试使用Tim Ward的ItemBuckets包进行另一种方法)

编辑:只是想到在执行实际循环之前在for循环中定义select也可以获得一些性能提升,就像这样。 (顺便说一下,不确定这是否属实;)

<xsl:variable name="list" select="($home/item[]..... etc.)" />
<xsl:for-each select="$list>
 ....