使用XSLT进行奇怪的排序要求

时间:2011-08-15 17:30:38

标签: xslt sorting

我有一个奇怪的要求。

我在xslt中有一个包含月份的变量,其id(1-12)

问题是我需要全部显示它们,但从1月(1)以外的月份开始。

目前我有以下

<xsl:variable name="months">
    <Months>
        <Month ID="1">JAN</Month>
        <Month ID="2">FEB</Month>
        <Month ID="3">MAR</Month>
        <Month ID="4">APR</Month>
        <Month ID="5">MAY</Month>
        <Month ID="6">JUN</Month>
        <Month ID="7">JUL</Month>
        <Month ID="8">AUG</Month>
        <Month ID="9">SEP</Month>
        <Month ID="10">OCT</Month>
        <Month ID="11">NOV</Month>
        <Month ID="12">DEC</Month>
    </Months>
</xsl:variable>

然后我迭代这个以便我可以在给定月份开始

<xsl:for-each select="msxsl:node-set($months)//Month[@ID >= $startAtMonth]">
    <xsl:sort data-type="number" select="@ID"/>
    <th>
        <xsl:value-of select="text()"/>
    </th>
</xsl:for-each>
<xsl:for-each select="msxsl:node-set($months)//Month[not(@ID >= $startAtMonth)]">
    <xsl:sort data-type="number" select="@ID"/>
    <th>
        <xsl:value-of select="text()"/>
    </th>
</xsl:for-each>

但它需要两个for-each语句,并且在一些地方需要这个for-each。有没有更简洁的方法来写这个,所以它是一个循环?

1 个答案:

答案 0 :(得分:3)

如何使用模运算?

<xsl:sort data-type="number" select="(number(@ID)+12-$startAtMonth) mod 12"/>