この XML を使用して、項目を 1 つのカテゴリに表示し、グループの見出しの下にグループ化する必要があります。空のグループは表示されません (たとえば、カテゴリが x に等しい場合、グループ C の見出しは表示されません。カテゴリ z とグループ A および B も同様です)。
<group name="A">
<item name="A1" category="x"/>
<item name="A2" category="x"/>
<item name="A3" category="y"/>
</group>
<group name="B">
<item name="B1" category="x"/>
</group>
<group name="C">
<item name="C1" category="y"/>
<item name="C2" category="z"/>
</group>
空のグループを表示することはできないため、項目を $items に既にフィルター処理しています。このセットは、グループ化をレンダリングするテンプレートにパラメーターとして渡します (以下を参照)。このテンプレートでは、グループ化ごとにテンプレートを呼び出して、現在のグループ内の項目をレンダリングする必要があります。
<xsl:template name="groups">
<!-- This is already filtered by category -->
<xsl:param name="items" />
<!-- Select only the groups that should be displayed -->
<xsl:for-each select="$items/parent::group">
<h1><xsl:value-of select="./@name"/></h1>
<!-- Display all filtered items in this group -->
<div class="items">
<xsl:call-template name="items">
<!-- How can I get the items from $items for the current group? -->
<xsl:with-param name="partners" select="$items..."/>
</xsl:call-template>
</div>
</xsl:for-each>
</xsl:template>
テンプレートparam
に渡すには何を選択すればよいですか?items
すべてのアイテムを表示するテンプレート:
<xsl:template name="items">
<xsl:param name="items" />
<xsl:for-each select=".">
<div class="item">
<xsl:value-of select="./@name" />
</div>
</xsl:for-each>
</xsl:template>
カテゴリ z でフィルタリングした場合の最終結果は次のようになります。
<h1>C</h1>
<div class="items">
<div class="item">C2</div>
</div>