Sunteți pe pagina 1din 5

Creando plantillas XSLT para nuestros XML

Introduccin
Una forma de aadir un poco de estilo a nuestros XML es con las plantillas XSLT.
Las pginas HTML son en definitiva tags con atributos y valores, tipo XML. Por poner
un ejemplo, toda pgina HTML bien formada contiene almenos un nodo padre <html>
y dentro de ste encontramos un nodo hijo cabecera <head> con otro nodo con el
ttulo de la pgina <title>, y un nodo hermano de cabecera que sera<body>, todos
oportunamente cerrados.

<html>
<head>
<title></title>
</head>
<body>
</body>
</html>

Podemos imaginar una jerarqua de padres, hijos y hermanos digna de cualquier


documento XML. De ah que naciera el Document Object Model (DOM), una API para
manipular estos tags, atributos y valores como si fuera una gran familia. Gracias a ella
podemos crear y modificar nodos dentro nodos padres, es decir, generamos
dinmicamente el HTML en la parte del cliente, y en eso se basan precisamente las
plantillas XSLT.
Estas plantillas indican como mostrar el contenido del XML como si fuera cdigo
HTML, es decir, el servidor no tiene que generar todo el cdigo HTML (por ejemplo
una tabla) sin que es el propio cliente el que aplica esta plantilla y sus estilos si los
hay.
XSL ofrece mltiples herramientas para visualizar los documentos XML, sin embargo
para recorrer el fichero y mostrar valores y atributos necesitaremos solamente cuatro
nociones bsicas que explico en el siguiente ejemplo.

Nuestra primera plantilla XSLT


Vamos a crear el siguiente fichero XML llamado Poetas.xml con una codificacin utf-8,
formado por nodos padre e hijos, con valor y tambin atributos. Fijaros en la
sobretodo en la segunda lnea que carga el fichero plantilla.xsl. Ese fichero debe estar
ubicado en el mismo directorio que el XML:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="plantilla.xsl"?>
<Poetas>
<Poeta nacimiento="1898" pais="Espana">
<nombre>Federico</nombre>
<apellidos>Garcia Lorca</apellidos>
<enlace>http://es.wikipedia.org/wiki/Garcia_Lorca</enlace>
</Poeta>
<Poeta nacimiento="1896" pais="Espana">
<nombre>Antonio </nombre>
<apellidos>Lara de Gavilan</apellidos>
<enlace>http://es.wikipedia.org/wiki/Antonio_de_Lara</enlace>
</Poeta>
<Poeta nacimiento="1904" pais="Chile">
<nombre>Pablo</nombre>
<apellidos>Neruda</apellidos>
<enlace>http://es.wikipedia.org/wiki/Pablo_Neruda</enlace>
</Poeta>
</Poetas>

Como vis es un XML muy sencillo y tiene un poco de todo.


Vamos a por nuestra plantilla. En la documentacin oficial de XSLT hay mil y un
tags XSLT para realizar diferentes operaciones, nosotros nos bastaremos con las
cabeceras y un bucle.
El objetivo es transformar el XML a una tabla. Para ello vamos a tener que recorrer los
poetas uno por uno, extraer los campos que queramos y mostrarlos en una fila de la
tabla.
Creamos nuestra plantilla.xsl:
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<html>

<head>
<title>Poetas</title>
</head>
<body>
<h3>Poetas del 27</h3>
<table border="1">
<thead>
<th>Nombre</th>
<th>Nacimiento</th>
<th>Pais</th>
</thead>
<xsl:for-each select="Poetas/Poeta">
<tr>
<td>
<a href="{enlace}">
<xsl:value-of select="nombre" />
<xsl:text> </xsl:text>
<xsl:value-of select="apellidos" />
</a>
</td>
<td>
<xsl:value-of select="@nacimiento" />
</td>
<td>
<xsl:value-of select="@pais" />
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Vamos a analizarla un poco. Todos los tags xsl empiezan con <xls: > y deben ser
debidamente cerrados. En las cabeceras encontramos primero la codificacin de
carcteres, que como ya habamos puesto en el XML ser tambin utf-8 y despus
tenemos abiertos por nomenclatura los tags de stylesheet y template.
En template encontramos el atributo match a / indicando el nodo raiz al principio de
todo e indicando cundo tiene que empezar a procesar el XML. Como / es
simplemente la raiz indicamos que estamos dentro del XML, justo antes del tag
<Poetas>.

Vamos bajando hasta encontrar el tag for-each, que indica el bucle dnde
recorreremos cada Poeta. El atributo select indica el nodo que se recorrer, en
nuestro caso indicamos Poetas/Poeta para hacer que recorra cada uno de los Poetas.
Una vez dentro del nodo tenemos que mostrar los valores y los atributos. Empezamos
por el enlace, que curiosamente es un caso especial, ya que tenemos que mostrar un
valor como si fuera un atributo del tag <a>, para estos casos basta con poner el
nombre del nodo hijo entre llaves {enlace}.
Seguidamente mostramos un valor con el tag value-of y en el select indicamos el nodo
hijo que queremos mostrar. Fijaros que entre nombre y apellidos hay un tag text. Sirve
para mostrar texto simple en XSLT, en este caso lo utilizamos para mostrar un
espacio.
Por ltimo para mostrar los atributos del ao y el pas usamos el mismo tag value-of
pero en select en vez de indicar el nodo escribimos una @ y el atributo @nacimiento,
@pais.
Ahora si abrimos nuestro .XML con Internet Explorer o Firefox (parece que a Chrome
no le gustan los XSL) deberamos ver nuestra tabla generada dinmicamente:

Para demostrar que es el cliente y no el servidor quien pinta los datos a partir de la
plantilla podemos visualizar el cdigo fuente y veremos simplemente el XML. Sin
embargo utilizando alguna herramienta para analizar el DOM, como el addon Firebug
de Firefox, podemos ver que el HTML generado en el cliente es el siguiente:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Poetas</title>
</head>

<body>
<h3>Poetas del 27</h3>
<table border="1">
<thead>
<th>Nombre</th>
<th>Nacimiento</th>
<th>Pais</th>
</thead>
<tbody>
<tr>
<td>
<a
href="http://es.wikipedia.org/wiki/Garcia_Lorca">Federico Garcia
Lorca</a>
</td>
<td>1898</td>
<td>Espana</td>
</tr>
<tr>
<td>
<a
href="http://es.wikipedia.org/wiki/Antonio_de_Lara">Antonio Lara de
Gavilan</a>
</td>
<td>1896</td>
<td>Espana</td>
</tr>
<tr>
<td>
<a href="http://es.wikipedia.org/wiki/Pablo_Neruda">Pablo
Neruda</a>
</td>
<td>1904</td>
<td>Chile</td>
</tr>
</tbody>
</table>
</body>
</html>

S-ar putea să vă placă și