Cuando hablamos de listas simples nos referimos a aquellas listas que sólo tienen un nivel. Para elaborar una lista simple con XSLT podemos usar el elemento xsl:number. Sin embargo, vamos a ver que en XSLT existe una manera alternativa de realizar una lista numerada. En ambos casos el resultado que conseguimos es el mismo que si usásemos las etiquetas <lo><li> de HTML,
Empezamos por el método que se utiliza para realizar una lista numerada en HTML. El siguiente código HTML la ejecuta:
<lo> <li>flores </li> <li>cuadros </li> <li>copas </li> <li>vasos </li> </lo>
Producirá la siguiente salida en pantalla:
- flores
- cuadros
- copas
- vasos
Ejecución de una lista numerada simple XSLT mediante la utilización de la función position() de XPath
La función de XPath position() nos da el índice que un nodo ocupa en el orden de proceso teniendo en cuenta todos los demás nodos que se procesan al mismo tiempo que él. Un poco embrollado me quedó. Por ejemplo, si se han de procesar 20 nodos el primero de la lista tendrá position()=1, el segundo position()=2, etc..
Supongamos el siguiente documento XML, que contiene las Islas Canarias:
<?xml version="1.0" encoding="UTF-8"?> <!-- New document created with EditiX at Mon Apr 16 22:48:44 BST 2012 --> <!-- Islas Canarias --> <islas> <isla>La Palma </isla> <isla>La Gomera </isla> <isla>El Hierro </isla> <isla>Tenerife </isla> <isla>Gran Canaria </isla> <isla>Lanzarote </isla> <isla>Fuerteventura </isla> </islas>
<?xml version="1.0" encoding="UTF-8"?> <!-- New document created with EditiX at Tue Apr 17 00:09:53 BST 2012 --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="islas"> <xsl:apply-templates select="isla"/> </xsl:template> <xsl:template match="isla"> <xsl:value-of select="position( )"/> <xsl:text>. </xsl:text> <xsl:value-of select="."/> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
Fíjate que el método de la hoja de transformación es texto (method="text"). O sea, el fichero de salida tendrá el formato texto. Es importante ese extremo para evaluar la salida, que será la siguiente:
1. La Palma
2. La Gomera
3. El Hierro
4. Tenerife
5. Gran Canaria
6. Lanzarote
7. Fuerteventura
El resultado en mi programa de transformación EditiX me produce una salida inesperada, que consiste en que intercala dos saltos de línea entre los nombres de las islas en lugar de uno, tal como la hoja de transformación contiene en las líneas 12 y 13. Tendría que investigar el motivo. De momento lo dejo así.
Si quisiera una transformación HTML, la hoja tendría que ser redactada de una manera ligeramente diferente porque, recordemos, el salto de línea en HTML se consigue con <br>, en lugar de insertar (ascii 10) para lograr el mismo resultado
1. La Palma
2. La Gomera
3. El Hierro
4. Tenerife
5. Gran Canaria
6. Lanzarote
7. Fuerteventura
El resultado en mi programa de transformación EditiX me produce una salida inesperada, que consiste en que intercala dos saltos de línea entre los nombres de las islas en lugar de uno, tal como la hoja de transformación contiene en las líneas 12 y 13. Tendría que investigar el motivo. De momento lo dejo así.
Si quisiera una transformación HTML, la hoja tendría que ser redactada de una manera ligeramente diferente porque, recordemos, el salto de línea en HTML se consigue con <br>, en lugar de insertar (ascii 10) para lograr el mismo resultado
<?xml version="1.0" encoding="UTF-8"?> <!-- New document created with EditiX at Wed Apr 18 22:59:06 BST 2012 --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="islas" /> </body> </html> </xsl:template> <xsl:template match="islas"> <xsl:apply-templates select="isla"/> </xsl:template> <xsl:template match="isla"> <xsl:value-of select="position( )"/> <xsl:text>. </xsl:text> <xsl:value-of select="."/> <br/> </xsl:template> </xsl:stylesheet>
La transformación dará como salida html la siguiente:
<html> <body>1. La Palma <br>2. La Gomera <br>3. El Hierro <br>4. Tenerife <br>5. Gran Canaria <br>6. Lanzarote <br>7. Fuerteventura <br></body> </html>
Código que, por supuesto se verá desde el navegador exactamente igual que la salida para texto que puse más arriba
1. La Palma
2. La Gomera
3. El Hierro
4. Tenerife
5. Gran Canaria
6. Lanzarote
7. Fuerteventura
1. La Palma
2. La Gomera
3. El Hierro
4. Tenerife
5. Gran Canaria
6. Lanzarote
7. Fuerteventura
Ejecución de una lista numerada simple XSLT mediante la utilización del elemento xsl:number
Simplemente sustituimos en el código de la hoja de transformación anterior la línea que contiene la expresión xsl:value-of select="position()" por la expresión del elemento <xsl:number />, de tal forma que la hoja de transformación nos queda así:<?xml version="1.0" encoding="UTF-8"?> <!-- New document created with EditiX at Wed Apr 18 22:59:06 BST 2012 --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="islas" /> </body> </html> </xsl:template> <xsl:template match="islas"> <xsl:apply-templates select="isla"/> </xsl:template> <xsl:template match="isla"> <!-- Aquí es donde cambiamos el código para introducir el elemento mumber --> <!-- en lugar de la función position --> <xsl:number /> <xsl:text>. </xsl:text> <xsl:value-of select="."/> <br/> </xsl:template> </xsl:stylesheet>
No hay comentarios:
Publicar un comentario