XML:
<node>
<node date="01-01-2002">Node</node>
<node date="01-01-2005">Node</node>
<node date="01-01-2001">Node</node>
<node date="01-01-2003">Node</node>
<node date="01-01-2006">Node</node>
<node>
<node date="01-01-2000">Node</node>
<node date="01-01-2007">Node</node>
</node>
<node date="01-01-2004">Node</node>
</node>
問題:
日付でソートし、限られた数のソート済みノードを取得する必要があります。任意の数のレベルをトラバースできる必要があります。
必要な結果:
<p>01-01-2000</p>
<p>01-01-2001</p>
<p>01-01-2002</p>
<p>01-01-2003</p>
<p>01-01-2004</p>
前提:
日付で並べ替えるには、タイム スタンプを返す c# 拡張メソッドを使用します。
<xsl:sort select="cs:formatDate(@date)" order="ascending" data-type="number" />
最も古いノードを 5 つに制限します。
順序: 昇順
XSLT 1.0
編集: 要求されたように、これは私がこれまでに得た場所です:ネストされていないノードの並べ替えと制限を行うことができます:
<xsl:template match="node">
<xsl:apply-templates select="node">
<xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
<xsl:with-param name="limit" select="5"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="node[@date]">
<xsl:param name="limit" />
<xsl:if test="position() < $limit+1">
<h5><xsl:value-of select="@date"/></h5>
</xsl:if>
</xsl:template>
または、以下のようにネストされたノードを申請しようとすると、ネストされたノードが分離してソートされ、同じ方法でそれらを制限できなくなります。
<xsl:template match="*">
<xsl:apply-templates select="node[@date]">
<xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
</xsl:apply-templates>
<xsl:apply-templates select="node[not(@date)]">
</xsl:apply-templates>
</xsl:template>
<xsl:template match="node[@date]">
<h5><xsl:value-of select="@date"/></h5>
</xsl:template>
<xsl:template match="node[not(@date)]">
<xsl:apply-templates select="node[@date]">
<xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
</xsl:apply-templates>
<xsl:apply-templates select="node[not(@date)]">
</xsl:apply-templates>
</xsl:template>
編集:
明らかだと思いましたが、おそらくそうではありません。制限の前にソートを適用する必要があります。例: 「最も古い 5 つのノードを取得する」および NOT:「xml から最初の 5 つのノードを取得し、それらを並べ替える」