Как сделать XSL:для каждого в обратном порядке

Я хочу изменить в XSL/FO цикл for-each.

например 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.

как это возможно?


person Theresa Forster    schedule 04.05.2011    source источник


Ответы (3)


Используйте 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>
person khachik    schedule 04.05.2011
comment
именно то, что я искал, особенно спасибо, так как это справа налево fo:flow для арабских документов с использованием 0,23 FOP (настроено и не может быть обновлено) - person Theresa Forster; 04.05.2011
comment
Правильный ответ. Хотя для этого случая нет необходимости в descendant-or-self::*/record. Это может быть просто record. - person ; 04.05.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)

person Nathan    schedule 04.05.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>
person AlexanderJohannesen    schedule 04.05.2011