ニュース一覧など、記事を新着順に並べたリストを生成するやり方です。
記事を新着順に並べる
たとえば、次のようなタグで、ニュース一覧を生成したいとします(ここで「@c」は表示する件数です):
<x:news c="25"/>
このとき、それぞれのページを次のように記述している場合は:
<page key="setcmm_202205101857397935640846"> <lead>ニュース一覧を自動生成する:x:news</lead> <date mode="init">2022.05.10</date> <date mode="last">2022.05.10</date> ... </x:page>
次のようなXSLスタイルシートを書くことで、ニュース一覧を生成できます:
<xsl:template mode="x:mapper" match="x:news"> <dl> <xsl:apply-templates mode="x:news_page" select="/*/x:book/x:page[x:date]"> <xsl:with-param name="c" select="@c"/> <xsl:sort select="x:date" order="descending"/> </xsl:apply-templates> </dl> </xsl:template> <xsl:template mode="x:news_page" match="/*/x:book/x:page"> <xsl:param name="c"/> <xsl:if test="position() <= $c"> <dt>・</dt><dd><xsl:value-of select="x:date"/>: <a href="{@key}.htm"><xsl:value-of select="x:lead"/></a></dd> </xsl:if> </xsl:template>
日付順に並べるためのXSLのタグが、「xsl:sort」です。これを使い、タグ「x:page」下にあるタグ「x:date」で整列させます(新しい順に並べるため、属性「@descending 」を指定しています)。その際、表示件数を制限するため、関数「position()」からその要素の位置を調べています。[※1]
- ※1
- ここで注意することは、関数「position()」は整列後のテンプレートでしか使えない、ということです。また、そのテンプレートでも合致条件「@match」には使えません。