Как сделать XSL: для каждого в обратном порядке - PullRequest
20 голосов
/ 04 мая 2011

Я хочу изменить в 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 ]

30 голосов
/ 04 мая 2011

Используйте 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>
5 голосов
/ 04 мая 2011

Да, Александр прав - забыл тип данных:

<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)

3 голосов
/ 04 мая 2011

xsl: sort ваш друг;

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