如何以相反的顺序执行XSL:for-each

时间:2011-05-04 11:16:28

标签: xml xslt xsl-fo

我希望在每个循环中反转XSL / FO。

例如xml

<data>
  <record id="1"/>
  <record id="2"/>
  <record id="3"/>
  <record id="4"/>
  <record id="5"/>
  <record id="6"/>
</data>

使用xsl

<xsl:for-each select="descendant-or-self::*/record">
   <xsl:value-of select="@id"/>
</xsl:for-each>

我正在寻找输出654321而不是123456

这怎么可能?

3 个答案:

答案 0 :(得分:29)

使用xsl:sort不是@id排序,而是按position()排序:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/data">
    <xsl:for-each select="descendant-or-self::*/record">
        <xsl:sort select="position()" data-type="number" order="descending"/>
        <xsl:value-of select="@id"/>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:5)

是的,亚历山大是对的 - 虽然忘记了数据类型:

<xsl:for-each select="descendant-or-self::*/record">
   <xsl:sort select="@id" order="descending" data-type="number" />
   <xsl:value-of select="@id"/>
</xsl:for-each>

(没有它,你会遇到数字超过9的排序问题)

答案 2 :(得分:3)

xsl:sort是你的朋友;

<xsl:for-each select="descendant-or-self::*/record">
   <xsl:sort select="@id" order="descending" />
   <xsl:value-of select="@id"/>
</xsl:for-each>