2011-05-04 55 views
20

Estoy buscando invertir en XSL/FO un bucle for-each.Cómo hacer un XSL: para cada uno en orden inverso

por ejemplo el xml

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

con el XSL

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

Busco a la salida 654321 y 123456 no

cómo es esto posible?

Respuesta

28

Uso xsl:sort no para ordenar por @id pero para ordenar por 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> 
+0

exactamente lo que yo estaba buscando, gracias especialmente porque es de derecha a izquierda una fo: flujo para documentos árabes usando 0.23 de FOP (personalizado e imposible de actualizar) –

+0

Respuesta correcta. Aunque para este caso no hay necesidad de 'descenddant-or-self :: */record'. Podría ser simplemente 'record'. –

3

xsl:sort es tu amigo;

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

Sí, Alexander es correcto - se olvidó el tipo de datos sin embargo:

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

(sin eso, se encontrará con la clasificación problemas con los números de más de 9)

Cuestiones relacionadas