Al igual que XML, XSLT es un lenguage de programación. Forma parte de la trilogía transformadora de XML, compuesta por las CSS (Cascading Style Sheets, hojas de estilo en cascada), que permite dar una apariencia en el navegador determinada a cada una de las etiquetas XML; las XSLT (XML Stylesheets Transformation Language, o lenguaje de transformación basado en hojas de estilo); y las XSL:FO, (Formatting Objects, objetos de formateo), o transformaciones para fotocomposición, o, en general, para cualquier cosa que no sea XML, como por ejemplo HTML "del viejo" o PDF (el formato de Adobe).
| XHTML sí es XML, sigue un DTD, y sólo admite documentos "bien formados". HTML no lo es, aunque pude convertirse fácilmente en XHTML usando utilidades tales como Tidy. |
XSLT es pues, un lenguaje que se usa para convertir documentos XML en otros documentos XML; puede convertir un XML que obedezca a un DTD a otro que obedezca otro diferente, un documento XML bien formado a otro que siga un DTD, o, lo más habitual, convertirlo a "formatos finales, tales como WML o HTML.
Los programas XSLT están escritos en XML, y generalmente, se necesita un procesador de hojas de estilo, o stylesheet processor para procesarlas, aplicándolas a un fichero XML.
El estilo de programación con las hojas XSLT es totalmente diferente a los otros lenguajes a los que estamos acostumbrados, tales como C++, PERL, pareciéndose más a "lenguajes" tales como el AWK, o a otros lenguajes funcionales, tales como ML o Scheme. En la práctica, eso significa dos cosas:
En resumen, programar con las XSLT puede ser un poco frustante, pero cuando uno aprende a usarlas, no puede vivir sin ellas. En realidad, son la única alternativa cuando uno quiere adaptar un contenido descrito con XML a diferentes clientes. Lo que consiguen las hojas de estilo es separar la información de su presentación, usando en cada caso las transformaciones que sean necesarias para que el contenido aparezca de la forma más adecuada en el cliente. Es más, se pueden usar diferentes hojas de estilo, o incluso la misma, para presentar la información de diferentes maneras dependiendo de los deseos o de las condiciones del usuario.
En realidad, XSLT son un lenguaje de programación, y por tanto se podría hacer cualquier cosa con ellas; incluso calcular la célebre criba de Eratóstenes. Pero a nosotros nos va a interesar más como simple herramienta de transformación de XML.
Actualmente hay dos versiones del estándar XSLT: la versión 1.0, que es la que implementan la mayoría de los procesadores, y se denomina "recomendación", es decir, para el consorcio W3, lo equivalente a un estándar, y la versión 1.1 , un "working draft", o borrador de trabajo, que es el paso previo a un estándar. Algunos procesadores, tales como el Saxon, implementan ya esta última versión. Hay pocas diferencias; la principal es que se pueden crear varios documentos de salida, en vez de uno solo.
| Las convenciones que seguimos en los ejemplos son las siguientes: cada etiqueta XML en el documento XML van en diferente color, dependiendo de su posición en la jerarquía; en las hojas XSL, el código XML está en rojo, el código XSLT en verde, y el código que no es exclusivo ni de uno ni de otro, y que aparecerá tal cual en el documento final, en azul. |
Para Windows, en sus diferentes versiones, hay dos herramientas que permiten editar XML y hojas de estilo XSLT, y aplicar directamente la una a la otra. Una de ellas es XMLSpy, que tiene un IDE muy bonito, pero que casca con relativa frecuencia. De hecho, he sido incapaz de aplicar una hoja de estilo a un documento XML. Otra opción es usar eXcelon Stylus, un peaso de programa, pero que sólo está disponible para WindowsNT/2000 (y no sé si XP).
Para editar XML y XSLT no hace falta ningún editor especial, pero viene bien un editor de XML o incluso un entorno integrado que te ayude a indentar bien el código, e incluso a cerrar las etiquetas en el orden correcto. En ese sentido, si se trabaja en Windows, el mejor es el eXcelon Stylus; en Linux, se puede uno apañar bien con el XEmacs.
Este tutorial no pretende ser una introducción exhaustiva al XML, en realidad, para los efectos de este tutorial, hay que saber poco XML: sólo que hace falta emparejar bien las etiquetas, y la estructura de árbol que sigue un documento XML. En realidad, WML está ya definido como un documento XML, y la última versión de HTML, XHTML, también lo es, o sea que no es un salto grande pasar de WML/XHTML a XML. En todo caso, los que quieran saber un poco más sobre el tema, pueden consultar los diferentes tutoriales del curso GeNeura de XML.
Ejercicios
1. Crear un documento XML que describa una ficha de alumno. Tiene que
tener una etiqueta raíz (por ejemplo, acta), una
etiqueta por cada alumno, y dentro de ellas, etiquetas
para el DNI, nombre, apellidos y nota.
Hay muchas formas de usar las hojas de estilo. Lo más normal es usarlas dentro de un entorno de publicación tal como el Cocoon, o el IBM Transcoding Publisher, AxKit u otros por el estilo. Un entorno de publicación de XML permite mantener sitios completos basados en XML, y generar páginas en diferentes formatos a partir de ellos. En este tutorial usaremos Cocoon, que es una herramienta gratuita y Open Source basada en Java, y además una de las más avanzadas en el sector. Para una solución profesional, es mejor el IBM TP, pues forma parte del servidor de aplicaciones WebSphere, y cuenta con interfaz gráfico avanzado; el problema es el coste.
| La principal diferencia entre la versión 2 de Xalan y las anteriores es que implementa el llamado TrAX, una API para poder aplicar transformaciones a árboles XML; probablemente incorpore también la versión 1.1 de XSLT |
En muchos casos, lo que se necesita es aplicar hojas de estilo dentro de una aplicación, o usarlas desde línea de comandos a partir de otra aplicación o otro lenguaje de programación. En ese caso, lo más útil es usar un procesador de hojas de estilo, que habitualmente se encuentra en conjunción con un parser XML, con o sin validación. De estos, hay los siguientes:
XML::XSLT para
PERL. Estos módulos se pueden usar para poder trabajar con XSLT fuera
de entornos de publicación, como por ejemplo un servidor web
normal.Finalmente, para este curso, se puede usar un formulario simple que aplica hojas de estilo XSLT a documentos XML usando Perl: aplicador de hojas de estilo.
| Contenido de esta sección |
|---|
|
Para empezar, vamos a tratar de presentar una hoja XML de lo más simple (hola.xml):
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="hola.xsl" type="text/xsl"?>
<tarjeta>
Hola
</tarjeta>
Para convertirlo en HTML, usaremos la siguiente hoja de estilo
(hola-html.xsl):
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">4
5 <xsl:template match='/'>
6 <html>
7 <head><title>Generado con hola-html.xsl</title></head>
8 <body>
9 <h1> <xsl:apply-templates /> </h1>
10 </body>
11 </html>
12 </xsl:template>
13 </xsl:stylesheet>
Para procesarlo con el Xalan, tendremos que hacer lo siguiente:
unix$ export PATH=$PATH:/usr/bin/java (o
donde quiera que esté).jar (ficheros de librería)
que incluyen Xerces (el parser de XML) y Xalan (el procesador de
XSLT):
unix$ export CLASSPATH=$CLASSPATH:/usr/local/xalan/bin/xalan.jar:/usr/local/xalan/xerces.jar (o
donde quiera que estén)java org.apache.xalan.xslt.Process -IN hola.xml -XSL hola-html.xsl -OUT hola.html.
Esto debería dar como resultado algo como lo que hay en la imagen.
El Instant Saxon es una versión de Saxon que ocupa poco y es relativamente fácil de usar. Hay que tener instalada una máquina virtual Java en Windows para que funcione; si tenemos instalado el Internet Explorer, con eso vamos que ardemos. Una vez instalado el explorer, basta escribir:
saxon -o hola.html hola.xml hola-html.xsl
Que nos dará el mismo resultado que anteriormente, con un poco de suerte.
También se puede usar el script en geneura, editando los ficheros anteriores y cortándolos y pegándolos en el sitio adecuado. Este script usa dos librerías de Perl: XML::LibXML y XML::LibXSLT, que a su vez están basadas en las librerías de Gnome LibXML2 equivalentes.
Para empezar, el código XML contiene una simple etiqueta,
tarjeta, que contiene el texto que
queremos que aparezca en la página web. En el resto, la
primera línea simplemente describe que el resto del
documento es XML, y asocia la hoja de estilo XSLT
(hola-html.xsl) al documento.
La primera hoja de estilo con la que nos enfrentamos es
relativamente simple. El "esqueleto" es un documento HTML normal, al
cual tenemos que añadir "contenido dinámico", es decir, contenido
generado a partir del XML original. El XML original, como se ve, es
simplemente XML bien formado, no usa un DTD ni lo necesita: basta con
que haya una etiqueta raíz (tarjeta), las etiquetas
estén emparejadas correctamente y los atributos entre
comillas. Diferentes documentos XML podrían ser
procesados con la misma hoja de estilo, y darían
diferente resultado. Para hacernos una idea, en este
caso simple, una hoja XSLT es como una plantilla sobre
la que se cambian los contenidos.
Para empezar, se incluyen una serie de instrucciones, de la línea 1
a la 5: no son instrucciones en sí, sino que modifican el aspecto de
la salida. La primera declara el documento XML y el tipo de
codificación (que podría ser ISO-8859-1 en vez de UTF-8 si quisiéramos incluir
acentos y demás caracteres idiosincráticos), la segunda es la etiqueta
raíz de la hoja de estilo (cerrada en la última línea; recordemos que
una hoja de estilo XSL es también un documento XML y
por tanto tiene que seguir todas sus convenciones), mientras que
la tercera a quinta indican que la salida es el tipo de documento que
necesitan los terminales WAP, y que además, salga
indentado (indent='yes') para que salga
chuli.
Ese esqueleto está organizado en "templates", que son partes de la
hoja que se "disparan" cuando encuentran una etiqueta que corresponda
a lo que hay en su atributo match. El primer y único
template comienza en la línea 5, y, n este caso, el
template que corresponde a la etiqueta raíz genera un esqueleto de
baraja WML, con una tarjeta principal. La "orden" en la línea 9 cede el control a
los otros templates, es decir, trata de aplicar todos los demás
templates que haya en el documento, incluyendo el resultado de
aplicarlos precisamente en ese punto. En este caso no hay más
templates, salvo los llamados los templates por
defecto, que lo único que hacen es incluir el
contenido de la etiqueta raíz, que en este caso es
tarjeta en el documento de salida. Es
decir, en la práctica lo que hemos hecho es decirle
dónde tiene que incluir en el esqueleto los valores
del documento original.
La orden <xsl:apply-templates />
podría haberse sustituido por <xsl:value-of select='tarjeta' /> y habría tenido exactamente el mismo efecto, en este caso,
es decir, incluir el contenido de la etiqueta
tarjeta. Pero no funcionaría si hubiera
otras etiquetas más dentro de esa.
Ejercicios
1. Crear un documento con otra etiqueta raíz, por ejemplo
zzzxxx, y ver qué efecto tiene en la
salida .
2. Crear un documento con varias etiquetas anidadas, y aplicar la hoja
de estilo, para ver qué efecto tiene.
| Contenido de esta sección |
|---|
|
Vamos a ver algún documento XML algo más complicado; en concreto,
vamos a tratar de procesar documentos XML que
describen un periódico. El periódico está formado por
noticias, que a su vez tienen un título, un subtítulo,
uno o varios autores, un contenido, y uno o varios
enlaces. Inicialmente, podemos suponer que cada
noticia se compone solamente de un titular, como en el
siguiente fichero noticia.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="hola.xsl" type="text/xsl"?>
<periodico>
<noticia> Se va a armar la gorda </noticia>
<noticia> Como sigáis así, sus váis a enterá </noticia>
</periodico>
Este se transforma con la siguiente hoja XSLT noticia.xsl:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">4
5 <xsl:template match='/'>
6 <html>
7 <head><title>Generado con hola-html.xsl</title></head>
8 <body>
9 <h1> Noticias </h1>
10 <ul> <xsl:apply-templates /> </ul>
11 </body>
12 </html>
13 </xsl:template>
14
15 <xsl:template match='noticia'>
16 <li><xsl:value-of select='.' /></li>
17 </xsl:template>
18 </xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>>
<?xml-stylesheet href="hola.xsl" type="text/xsl"?>>
<periodico>
<noticia>
<titulo>Se va a armar la gorda </titulo>
<subtitulo>O si no, ya lo veréis </subtitulo>
<autor>Pepe I. Llo </autor>
<autor>Jose I. To </autor>
<contenido>Según fuentes bien informadas, va a liarse un follón de mil pares
de narices.
</contenido>
<enlace>http://www.elmundo.es </enlace>
<enlace>http://www.cnn.com </enlace>
</noticia>
</periodico>
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">4
5 <xsl:template match='/'>
6 <html>
7 <head><title>Generado con hola-html.xsl</title></head>
8 <body>
9 <h1> Noticias </h1>
10 <ul> <xsl:apply-templates /> </ul>
11 </body>
12 </html>
13 </xsl:template>
14
15 <xsl:template match='noticia'>
16 <li><em><xsl:value-of select='titulo'/></em>: <br />
17 <xsl:apply-templates match='autor|subtitulo|enlaces|contenido' /></li>
18 </xsl:template>
19
20 <xsl:template match='autor'>
21 <b>(<xsl:value-of select='.'/></b>):
22 </xsl:template>
23
24 <xsl:template match='subtitulo'>
25 <br /><small>(<xsl:value-of select='.'/></small>) <br />
26 </xsl:template>
27
28
29 </xsl:stylesheet>
Ejercicios
1. Crear un documento XML para una clasificación de fútbol y hacer una
hoja XSL para transformarla en HTML, de la mejor forma
posible.
Esta es la bibliografía que ha aparecido hasta el momento sobre el tema, especialmente en castellano
http://html.programacion.net/taller/tw_xml_y_xslt.php,
una introducción básica usando el motor XT.
Professional XSL, de varios autores,
que es un poco más avanzado que el anterior, y está bastante bien para
aprender truquillos.Hay también algunos tutoriales bastante buenos en inglés