2012-11-02 19 views
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。

回答

0

我已經獲得了「模板 - 應用模板」構造更好的性能。我也有一個包含數百個項目的XML。在特殊情況下,我不得不重新命名元素,並且性能增益差不多是30秒。

也用於其他原因,我會建議使用「模板 - 應用模板」建設: For loops vs. apply-templates

我希望幫助。

我相信你也可以調整你的例子中的代碼。你能提供一個源XML的例子嗎?

最好的問候, 彼得

+0

謝謝,我會試一試 – Jon

0

你也可以創建一個XSL擴展來填充的foreach。在XSL擴展中,您可以使用Linq僅選擇您真正需要的項目。

將數百個項目作爲子項目的另一個缺點是當您嘗試打開父項目時,內容編輯器可能會變得非常慢。例如,可以將子項目自動分成文件夾,例如,可以解決此問題(或者嘗試使用Tim Ward的ItemBuckets包以使用Lucene搜索索引的另一種方法)

編輯:想到了,在執行實際循環之前,循環也可以獲得一些性能改進,如下所示。 (不太確定這是否是真的,順便說一句);)

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