Как сделать XSL: для каждого в обратном порядке
Я ищу обратное в 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
как это возможно?
Ответы
Ответ 1
Используйте 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>
Ответ 2
Да, Александр прав - забыл тип данных:
<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
xsl: sort является вашим другом;
<xsl:for-each select="descendant-or-self::*/record">
<xsl:sort select="@id" order="descending" />
<xsl:value-of select="@id"/>
</xsl:for-each>