我有一些看起来像这样的代码:
<xsl:for-each select="($home/item[@key='issues']/item[@key='cwa']/item[@key='archives']/item[@key='2012']/*/*)">
<xsl:if test="(position() < 15) and (position() > 1)">
...
它工作正常,除了结果集中有数百个项目,我只想显示20. 2012年下面的结构看起来像这样
2012
01
02
03
所以理论上我只需要当月和上个月。有没有办法限制for-each语句本身?
这是在Sitecore CMS中,所以遗憾的是我无法轻松访问原始XML。
答案 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>
....