0

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

<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。

4

2 回答 2

0

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

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

我相信您也可以调整示例中的代码。

于 2012-11-02T15:16:59.493 回答
0

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

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

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

<xsl:variable name="list" select="($home/item[]..... etc.)" />
<xsl:for-each select="$list>
 ....
于 2012-11-02T19:58:09.957 回答