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#extension方法返回时间戳:
<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>
修改
我认为这很明显,但可能不是:我需要在极限之前应用排序。例如:“获得最旧的五个”而不是:“从xml中获取前五个节点,然后对它们进行排序”
答案 0 :(得分:2)
<xsl:template match="/">
<xsl:apply-templates select="//node[@date]">
<xsl:sort select="concat(substring-after(substring-after(@date,'-'),'-'),substring-before(substring-after(@date,'-'),'-'),substring-before(@date,'-'))" order="ascending" data-type="number" />
<xsl:with-param name="start" select="1"/>
<xsl:with-param name="end" select="5"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="node">
<xsl:param name="start" />
<xsl:param name="end" />
<xsl:if test="position() >= $start and position() <= $end">
<p>
<xsl:value-of select="@date"/>
</p>
</xsl:if>
</xsl:template>