sort
El elemento sort
permite ordenar los elementos que van a formar el XML de salida. Este elemento suele ir dentro de un elemento for-each
.
La estructura de este elemento es la siguiente:
<xsl:sort
select="expresion-xpath"
order="ascending|descending"
case-order="upper-first|lower-first"
data-type="string|number"
/>
Donde:
select
indica el elemento XML por el que ordenar.order
indica si se ordena en orden ascendente (ascending
) o descentente (descending
). El valor predeterminado esasceding
.case-order
indica si, para una misma letra, se ordena antes las mayúsculas (upper-first
) o minúsculas (lower-first
). Por defecto, su valor esupper-first
, es decir, se ordenan antes las mayúsculas.data-type
indica el tipo de dato a ordenar. Puede serstring
onumber
. Por defecto, su valor esstring
.
Un ejemplo de su uso sería el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Colección de música</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
<th>Precio</th>
</tr>
<xsl:for-each select="catalogo/cd">
<xsl:sort select="precio" data-type="number"/>
<tr>
<td><xsl:value-of select="titulo"/></td>
<td><xsl:value-of select="artista"/></td>
<td><xsl:value-of select="precio"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
El código anterior ordena los CDs de menor a mayor precio, es decir, en orden de precio ascendente. Se debe utilizar el valor number
para el atributo data-type
para que se ordenen correctamente, ya que se tratan de valores numéricos.
Consideremos que tenemos el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="hoja.xsl"?>
<catalogo>
<cd>
<titulo>Thriller</titulo>
<artista>Michael Jackson</artista>
<precio>12.99</precio>
</cd>
<cd>
<titulo>The Wall</titulo>
<artista>Pink Floyd</artista>
<precio>9.99</precio>
</cd>
<cd>
<titulo>Abbey Road</titulo>
<artista>The Beatles</artista>
<precio>14.99</precio>
</cd>
</catalogo>
En ese caso, la transformación XSLT daría como resultado un documento HTML:
<!DOCTYPE html>
<html>
<body>
<h2>Colección de música</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
<th>Precio</th>
</tr>
<tr>
<td>The Wall</td>
<td>Pink Floyd</td>
<td>9.99</td>
</tr>
<tr>
<td>Thriller</td>
<td>Michael Jackson</td>
<td>12.99</td>
</tr>
<tr>
<td>Abbey Road</td>
<td>The Beatles</td>
<td>14.99</td>
</tr>
</table>
</body>
</html>
El documento HTML se visualizaría de la siguiente manera:
Probar en el navegador