Convertir un fichero XML en una página web Enero 1, 2010
Publicado por lineadecodigo en : XSLT , 2 comentariosMediante este ejemplo vamos a iterar por los elementos de un documento XML utilizando las hojas de transformación XSLT. De esta manera conseguiremos convertir un fichero XML en una página web.
En el ejemplo lo que haremos será recorrer los elementos a partir de un punto especificado mediante XPath.
Lo primero que vamos a hacer es montar nuestro documento XML, el cual solo contendrá la información -en este caso libros y autores- y una referencia al archivo que realizará la transformación.
Así, nuestra información será algo parecido a lo siguiente:
<?xml version="1.0" encoding="iso-8859-1"?> <libros> <libro> <titulo>Fuente Ovejuna</titulo> <autor>Lope de Vega</autor> <isbn>84-9815-002-7</isbn> </libro> <libro> <titulo>La Celestina</titulo> <autor>Fernando de Rojas</autor> <isbn>84-96390-96-9</isbn> </libro> <libro> ... </libros>
Y la referencia a nuestro fichero de transformación:
<?xml-stylesheet type="text/xsl" href="listarElementos.xsl"?>
Hasta aquí sencillo. Ahora veamos qué tenemos que hacer en nuestro fichero de transformación. Lo primero será definir el template sobre el que queremos trabajar. En el template hacemos referencia, usando XPath, al elemento sobre el cual nos posicionaremos inicialmente. En nuestro caso nos vamos a posicionar sobre la raíz del documento XML. Es por ello que utilizaremos la expresión XPath "/". El elemento XSLT que utilizamos para definir la plantilla es xsl:template.
<xsl:template match="/"> </xsl:template>
Ahora definimos el bucle que recorrerá los elementos. Para ello utilizamos la etiqueta xsl:for-each. Lo que estamos diciendo sería algo así como "por cada elemento que encuentres del tipo x ves iterando". Dentro de la etiqueta xsl:for-each definiremos las acciones que queremos hacer con todos y cada uno de los elementos.
Para especificar el elemento sobre el que se itera, la etiqueta xsl:for-each tiene el atributo select. El cual, tendrá como parámetro un valor XPath que indica un elemento del árbol XML. Así, la etiqueta xsl:for-each nos quedaría de la siguiente forma:
<xsl:for-each select="libros/libro"> </xsl:for-each>
En nuestro caso trataremos cada uno de los libros. Por ello, el nodo elegido es "libros/libro".
Solo nos quedará realizar las acciones oportunas con cada uno de los libros. Este código, será el que pongamos dentro de la etiqueta xsl:for-each. Para nuestro ejemplo bastará con recuperar los valores del titulo y el autor. Para ello utilizamos la etiqueta xsl:value-of como vemos a continuación:
<xsl:value-of select="titulo"/><br/> <xsl:value-of select="autor"/>
De una forma sencilla e iterando los elementos de un documento XMLL hemos conseguido convertir a dicho documento en una página web.
|- Visualizar el ejemplo|- Descargar el código
|- Reportar error en el código
|- Foro sobre XSLT
Número de elementos de un fichero XML Diciembre 30, 2009
Publicado por lineadecodigo en : XSLT , Añadir un comenarioSi estás tratando un fichero XML es muy probable que necesites conocer el número de elementos que lo componen, de cara a poderlo manipular de una forma más sencilla. Sobre todo si están iterando en un bucle por el número de elementos de un determinado nodo.
Saber el número de elementos de un fichero XML dado un nodo en concreto es una tarea muy sencilla.
Imaginemos el siguiente XML (¡qué poco original que soy!):
<?xml version="1.0" encoding="iso-8859-1"?> <libros> <libro> <titulo>Fuente Ovejuna</titulo> <autor>Lope de Vega</autor> <isbn>84-9815-002-7</isbn> </libro> <libro> <titulo>La Celestina</titulo> <autor>Fernando de Rojas</autor> <isbn>84-96390-96-9</isbn> </libro> ... </libros>
Lo primero que haremos en nuestro fichero XSLT será el saber que parte de la estructura del documento XML nos interesa contar. Es decir, en un nodo en concreto, para saber el número de elementos que dicha estructura tiene. En este ejemplo, la idea es contar el número de libros que hay en el documento XML.
Para contar el número de elementos disponemos de una función. Esta es la función count():
count(xpath)
El parámetro de la función será una expresión xpath que haga relación a alguna estructura del documento XML que estamos tratando. En nuestro caso la expresión xpath será:
/libros/libro
Para poder mostrar por pantalla el número de elementos deberemos de utilizar la etiqueta xsl:value-of, la cual, en su parámetro select llevará la función count():
|- Visualizar el ejemplo
<xsl:value-of select="count(/libros/libro)"/>
|- Descargar el código
|- Reportar error en el código
|- Foro sobre XSLT
Ordenando un fichero XML Noviembre 28, 2009
Publicado por lineadecodigo en : XSLT , Hasta ahora 1 comentarioCada 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:
<?xml version="1.0" encoding="iso-8859-1"?> <libros> <libro> <titulo>Fuente Ovejuna</titulo> <autor>Lope de Vega</autor> <isbn>84-9815-002-7</isbn> </libro> <libro> <titulo>La Celestina</titulo> <autor>Fernando de Rojas</autor> <isbn>84-96390-96-9</isbn> </libro> <libro> <titulo>Don Juan Tenorio</titulo> <autor>Jose Zorilla</autor> <isbn>84-96390-97-7</isbn> </libro> </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:
<xsl:for-each select="libros/libro"> Titulo:<xsl:value-of select="titulo"/><br/> Autor:<xsl:value-of select="autor"/> </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:
<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).
|- Visualizar el ejemplo|- Descargar el código
|- Reportar error en el código
|- Foro sobre XSLT
Filtrar información en una XSLT Noviembre 6, 2009
Publicado por lineadecodigo en : XSLT , Hasta ahora 1 comentarioNuestras hojas de transformación no se tienen que limitar a recuperar toda la información de un fichero XML y a ponerla en otro tipo de formato. Puede ser que cierta información del documento no nos interese, o tenga que ser evaluada. Es por ello que puede darse el caso de que necesitemos filtrar información en una XSLT.
Para poder realizar esa evaluación de datos nos podemos apoyar en estructuras condicionales como xsl:if, xsl:choose y las funciones que tiene el lenguaje XSL.
Siguiendo al resto de los ejemplos XSLT de nuestra web, vamos a utilizar el fichero XML con los datos de los libros. Pero en este caso vamos a añadir un nuevo campo en la estructura. Este nuevo campo será el precio del libro. El fichero de libros nos quedará así:
<?xml version="1.0" encoding="iso-8859-1"?> <libros> <libro> <titulo>Fuente Ovejuna</titulo> <autor>Lope de Vega</autor> <isbn>84-9815-002-7</isbn> <precio>24</precio> </libro> <libro> <titulo>La Celestina</titulo> <autor>Fernando de Rojas</autor> <isbn>84-96390-96-9</isbn> <precio>32</precio> </libro> ... </libros>
La condición de nuestra hoja de transformación será el generar un listado de libros, pero siempre y cuando, estos, tengan un precio superior o igual a 30 euros.
Para ello lo primero que tenemos que hacer es mostrar el listado de libros. Esto lo conseguimos con una estructura repetitiva del tipo xsl:for-each. En medio de esta estructura, utilizando etiquetas xsl:value-of mostramos la información del titulo del libro, autor y precio del mismo. Tendremos el siguiente código:
<xsl:for-each select="libros/libro"> Titulo:<xsl:value-of select="titulo"/><br/> Autor:<xsl:value-of select="autor"/><br/> Precio:<xsl:value-of select="precio"/> </xsl:for-each>
El código anterior nos va a sacar todos los libros que tengamos definidos en nuestra estructura XML. Todavía no hemos ejecutado el filtro. Para aplicar el filtro utilizamos la etiqueta xsl:if. Antes de utilizarla refrescaremos cual es su estructura
<xsl:if test="condicion"> ... </xsl:if>
Como podemos ver, el atributo test es el que nos permite evaluar la condición. Como condición podemos utilizar cualquiera de las funciones que nos da el lenguaje XSLT o simplemente comparar valores de elementos del documento XML contra constantes. Este último caso será el nuestro. Y es que nosotros contrastaremos el valor de un elemento del documento, el precio, contra una constante, 24 (euros € o dolares $
) Quedándonos al final esta línea de código:
<xsl:if test="precio>24"> ... </xsl:if>
En el medio de esta decisión pondremos la extracción de información del libro, es decir, los xsl:value-of. Nuevamente, quedándonos:
|- Visualizar el ejemplo
<xsl:for-each select="libros/libro"> <xsl:if test="precio>=30"> Titulo:<xsl:value-of select="titulo"/><br/> Autor:<xsl:value-of select="autor"/><br/> Precio:<xsl:value-of select="precio"/> </xsl:if> </xsl:for-each>
|- Descargar el código
|- Reportar error en el código
|- Foro sobre XSLT
Cargar un combo con XSLT Septiembre 8, 2009
Publicado por lineadecodigo en : XSLT , Añadir un comenarioLa pretensión de este ejemplo es ver como podemos cargar un combo (desplegable) mediante una hoja XSLT. Es decir, utilizar los datos de un XML para que aparezcan como opciones de un combo.
Para ello partimos de nuestro XML de ejemplo de siempre. Nuestros autores. La verdad es que debería de pensar en sacarlo a una página aparte, ya que solo hago que hacer "copy & paste". Pero veamos como es el XML de autores:
<?xml version="1.0" encoding="iso-8859-1"?> <libros> <libro> <titulo>Fuente Ovejuna</titulo> <autor>Lope de Vega</autor> <isbn>84-9815-002-7</isbn> </libro> <libro> <titulo>La Celestina</titulo> <autor>Fernando de Rojas</autor> <isbn>84-96390-96-9</isbn> </libro> <libro> <titulo>Don Juan Tenorio</titulo> <autor>Jose Zorilla</autor> <isbn>84-96390-97-7</isbn> </libro> </libros>
En nuestro ejemplo vamos a cargar un combo con los títulos de los libros que están dentro del XML. A si que pongámonos manos a la obra con nuestra hoja de transformación.
Hay que recordar que las hojas de transformación son documentos XML. A si que lo primero que veremos en el será la cabecera que lo identifique XML y la definición del namespace de XSL.
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Esto era obvio, pero por si acaso había algún despistado, había que recordarlo.
Pero vayamos al meollo. Para conseguir la carga del combo tenemos que definir una plantilla. Dicha plantilla lo que tendrá que hacer es recorrer los elementos libro e ir generando las etiquetas que son las que representan el contenido del combo. Para iterar sobre los elementos utilizamos la etiqueta xsl:for-each.
En dicha etiqueta tenemos que establecer como atributo de iteración, select, el conjunto de etiquetas sobre las que queremos iterar. En nuestro caso libros/libro. Y en cada iteración obtener el valor del atributo. Para esto utilizaremos la etiqueta xsl:value-of, que al igual que la anterior tiene un atributo select, que en este caso indica la etiqueta de la cual se quiere recuperar el valor.
Al final nos queda algo así:
<xsl:for-each select="libros/libro"> <option><xsl:value-of select="titulo"/></option> </xsl:for-each>
Ya que al final, lo que vamos es buscando que la hoja de transformación suelte un código HTML como el siguiente:
A si que como has podido comprobar, dentro de la hoja de transformación entre el código anterior tendremos que añadir la etiqueta SELECT. Quedándonos la hoja de transformación como sigue:
<select> <xsl:for-each select="libros/libro"> <option><xsl:value-of select="titulo"/></option> </xsl:for-each> </select>
Y poco más. Solo recordar que el documento XML tiene que tener una referencia a la hoja de transformación que lo va a usar:
|- Visualizar el ejemplo
<?xml-stylesheet type="text/xsl" href="combo.xsl"?>
|- Descargar el código
|- Reportar error en el código
|- Foro sobre XSLT
Crear una tabla a partir de datos XML Septiembre 5, 2009
Publicado por lineadecodigo en : XSLT , Hasta ahora 1 comentarioA la hora de presentar datos una de los artificios más usados son las tablas. Con el lenguaje HTML es muy sencillo el montar una de ellas. Nos basta con controlar las etiquetas TABLE, TR y TD.
En el siguiente ejemplo utilizaremos XSLT para montar una tabla XHTML. Los datos de dicha tabla serán los datos que vayan en el XML. Para ello, lo primero que haremos será crear nuestro documento XML con la información a mostrar. Usamos un XML que representa información de libros:
<?xml version="1.0" encoding="iso-8859-1"?> <libros> <libro> <titulo>Fuente Ovejuna</titulo> <autor>Lope de Vega</autor> <isbn>84-9815-002-7</isbn> </libro> <libro> <titulo>La Celestina</titulo> <autor>Fernando de Rojas</autor> <isbn>84-96390-96-9</isbn> </libro> ... </libros>
Básicamente, como descripción de nuestro ejemplo, lo que vamos a hacer es recorrer los elementos de un path determinado e ir creando filas de la tabla.
Pero vamos por partes. Lo primero que tenemos que hacer en nuestro documento XSL, dentro de la plantilla principal es declarar la cabecera de la tabla:
<xsl:template match="/"> <html> <body> <h2>Mis Libros</h2> <table border="1"> <tr bgcolor="skyblue"> <th>Titulo</th> <th>Autor</th> </tr>
Una vez que tenemos la cabecera, tenemos que iterar por los elementos. Para cada fila hay que crear una etiqueta TR, que es una fila, y para cada elemento una etiqueta TD, que es una celda. Quedándonos el siguiente código:
<xsl:for-each select="libros/libro"> <tr> <td><xsl:value-of select="titulo"/></td> <td><xsl:value-of select="autor"/></td> </tr> </xsl:for-each>
Podemos comprobar que estamos mezclando el código XHTML con el código XSLT sin ningún problema. Para recorrer los elementos del documento XML utilizamos la etiqueta xsl:for-each, la cual, mediante el atributo select identifica un path en el árbol XML. En nuestro ejemplo, al mostrar los contenidos de los libros, el path será libros/libro.
Los valores de los elementos son recuperados mediante el xsl:value-of, que al igual que sucede con xsl:for-each, tiene un atributo select con el elemento XML a recuperar.
Solo nos quedará el cerrar la tabla dentro de la plantilla. El código más sencillo de todos:
</table> </body> </html> </xsl:template>
Aunque sea algo obvio, cabe recordar, que en el documento XML hay que crear un enlace al documento de transformación XSLT.
|- Visualizar el ejemplo
<?xml-stylesheet type="text/xsl" href="tabla.xsl"?>
|- Descargar el código
|- Reportar error en el código
|- Foro sobre XSLT
Mi primer XSLT Septiembre 4, 2009
Publicado por lineadecodigo en : XSLT , Añadir un comenarioXSLT es un lenguaje que nos permite transformar documentos XML de un formato a otro. Por ejemplo transformar documentos XML en documentos XHTML u otros documentos XML.
Para crear nuestro primer XSLT lo primero que tenemos que hacer es escribir nuestro fichero XML. En el caso de este ejemplo vamos a construir un documento de libros como vemos a continuación:
<?xml version="1.0" encoding="iso-8859-1"?> <libros> <libro> <titulo>Fuente Ovejuna</titulo> <autor>Lope de Vega</autor> <isbn>84-9815-002-7</isbn> </libro> <libro> <titulo>La Celestina</titulo> <autor>Fernando de Rojas</autor> <isbn>84-96390-96-9</isbn> </libro> ... </libros>
Lo que vamos a hacer mediante el XSLT es obtener información del documento XML y crear un documento XHTML donde se vean dichos datos.
Para construir el documento XSLT lo primero que tenemos que saber es que, este, es a su vez otro documento XML. Por lo tanto, la primera línea que nos encontraremos será la definición del XML.
<?xml version="1.0" encoding="iso-8859-1"?>
Lo siguiente es empezar a definir la hoja de estilos y el namespace asociado
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
En todo documento XSLT, su cuerpo, es formado por las plantillas. Estas nos indicaran a partir de que elemento del documento XML vamos a empezar a trabajar. Para nuestro ejemplo, y ya que vamos a pintar en pantalla el primer libro y el primer autor, nos posicionaremos dentro de la estructura libros dela siguiente forma:
<xsl:template match="libros">
El propio documento XSLT combina sentencias de transformación con código HTML. Por lo que encontraremos a continuación es un documento HTML.
<H1> Mi primer documento XSLT </H1> ...Código XSLT... </BODY> </HTML>
Aunque las sentencias del XSLT son bastantes, la que nosotros necesitamos conocer en este momento es la que nos ayuda a obtener el valor de una etiqueta XML. Cabe indicar que todas las etiquetas XSLT empiezas por xsl que es el namespace definido anteriormente.
Así, para recuperar el valor de una etiqueta usamos xsl:value-of. Como atributo de esta etiqueta encontramos select. El cual, nos sirve para seleccionar el nodo (elemento) del cual queremos extraer su valor:
<xsl:value-of select="libro/titulo"/> <xsl:value-of select="libro/autor"/>
Tanto en el template con el atributo match, como en la etiqueta xsl:value-of con el atributo select estamos utilizando valores XPath. Estos lo que vienen a reflejar, en grandes rasgos, son elementos dentro del árbol XML.
Lo último que nos quedará hacer es reflejar en el documento XML la relación con su fichero de transformación. Para ello utilizamos la siguiente línea dentro del fichero XML:
<?xml-stylesheet type="text/xsl" href="MiPrimerXSLT.xsl"?>
Aunque la potencia del XSLT es muy grande, nos vamos a encontrar que hay navegadores que no lo soportan. En el grupo de los navegadores que si lo soportan encontramos a FireFox, Internet Explorer 6,... y en el grupo de los que no Opera 8, Internet Explorer 5,...
Seguro que en el futuro, todos los navegadores incluirán el soporte de este potente lenguaje de transformación.
|- Visualizar el ejemplo|- Descargar el código
|- Reportar error en el código
|- Foro sobre XSLT



