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 を使用して、本当に必要な項目のみを選択できます。

何百ものアイテムを子アイテムとして持つことのもう 1 つの欠点は、親アイテムを開こうとすると、コンテンツ エディターが非常に遅くなる可能性があることです。たとえば、子アイテムを毎月フォルダーに自動的に分割すると、これを解決できます (または、Lucene Search インデックスを使用する別のアプローチとして、Tim Ward の ItemBuckets パッケージを試してください)。

編集:実際のループを実行する前に for ループで選択を定義すると、このようにパフォーマンスが向上する可能性があることを思い出すだけです。(ちなみに、これが本当かどうかは正確にはわかりません;))

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