Ordenando un fichero XML

28/Nov/2009 XSLT , , , , 7 Comentarios

Cada día tratamos más fuentes de información basadas en XML. Ficheros que intercambiamos, bases de datos basadas en XML o simplemente registros que contienen información variopinta.

Podemos apoyarnos en XSLT para dejar ordenado un fichero XML. Y al igual que cuando tratamos una base de datos, podemos dejarle ordenado por el campo que nosotros queramos.

Lo primero que tenemos que hacer es definir el XML sobre el que vamos a recuperar la información. Utilizaremos la misma estructura de libros que utilizamos en el resto de los ejemplos:

  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <libros>
  3. <libro>
  4. <titulo>Fuente Ovejuna</titulo>
  5. <autor>Lope de Vega</autor>
  6. <isbn>84-9815-002-7</isbn>
  7. </libro>
  8. <libro>
  9. <titulo>La Celestina</titulo>
  10. <autor>Fernando de Rojas</autor>
  11. <isbn>84-96390-96-9</isbn>
  12. </libro>
  13. <libro>
  14. <titulo>Don Juan Tenorio</titulo>
  15. <autor>Jose Zorilla</autor>
  16. <isbn>84-96390-97-7</isbn>
  17. </libro>
  18. </libros>

En primer lugar vamos a recorrer los elementos que queremos mostrar. En nuestro caso mostraremos los libros y autores de los mismos. Esto lo podemos llevar a cabo con la etiqueta xsl:for-each, la cual, mediante el atributo select demarca el path del documento XML sobre el que queremos iterar. El path elegido será libros/libro.

En el caso de que queramos recuperar los valores de un elemento en concreto utilizamos la etiqueta xsl:value-of. En este etiqueta, al igual que en la etiqueta xsl:for-each, el atributo select nos indicará el elemento a recuperar.

Al final nos quedará un código como el que vemos:

  1. <xsl:for-each select="libros/libro">
  2. <p>
  3. Titulo:<xsl:value-of select="titulo"/><br/>
  4. Autor:<xsl:value-of select="autor"/>
  5. </p>
  6. </xsl:for-each>

Vemos que nuestro documento XSLT combina etiquetas de transformación (etiquetas del namespace xsl) y etiquetas XHTML que conformarán el documento definitivo, obtenido tras la transformación.

Si solo ponemos este código, nos saldrá la información, pero sin ordenar:

Mis Libros

Titulo:Fuente Ovejuna
Autor:Lope de Vega

Titulo:La Celestina
Autor:Fernando de Rojas

Titulo:Don Juan Tenorio
Autor:Jose Zorilla

Titulo:Lazarillo de Tormes
Autor:Anonimo

Titulo:Fortunata y Jacinta
Autor:Benito Perez Galdos

Titulo:La Colmena
Autor:Camilo Jose Cela

Para ordenar los elementos utilizamos la etiqueta xsl:sort. Esta etiqueta tiene un atributo select que indica el path sobre el que queremos ordenar. Así, si queremos ordenar por nombre del titulo pondríamos la siguiente línea de código:

  1. <xsl:sort select="titulo"/>

Quedándonos el siguiente listado:

Mis Libros

Titulo:Don Juan Tenorio
Autor:Jose Zorilla

Titulo:Fortunata y Jacinta
Autor:Benito Perez Galdos

Titulo:Fuente Ovejuna
Autor:Lope de Vega

Titulo:La Celestina
Autor:Fernando de Rojas

Titulo:La Colmena
Autor:Camilo Jose Cela

Titulo:Lazarillo de Tormes
Autor:Anonimo

Hay que tener cuidado ya que la ordenación (xsl:sort) tiene que estar dentro de la iteración de elementos (xsl:for-each).

Difunde el Conocimiento

Si te ha gustado el artículo o te ha sido de utilidad, no dejes de compartirlo con tus amigos en las redes sociales... Te estaremos muy agradecidos. :-D

7 comentarios en “Ordenando un fichero XML”

Víctor Cuervo

Víctor Cuervo

@andre,

La idea es que el XML sea siempre externo, ordenarlo y luego volcarlo sobre la tabla tal y como se explica en http://lineadecodigo.com/xslt/crear-una-tabla-a-partir-de-datos-xml/.

Saludos.

Víctor Cuervo

andre

y como realizas ordenar el codigo xml si los valores estan dentro de una tabla?

Víctor Cuervo

Víctor Cuervo

@Diseño web,

Me alegro que te haya sido de utilidad. 😀

Víctor Cuervo

Diseño web

Es justo lo que andaba buscando, buen aporte. Un saludo.

Víctor Cuervo

Víctor Cuervo

@eric,

Me alegro que te haya servido. 😀

Víctor Cuervo

eric

Gracias por su pequeño tutorial…

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*

*