Página principal del curso de XML
Usando hojas de estilo para generar WML (teléfonos WAP)
Tutorial avanzado de generación de HTML a partir de XML/XSLT
Otros cursos y tutoriales: comercio electrónico, WAP, Webmaster
Página principal del grupo GeNeura

Generación de documentos WML usando XSLT y XML

J. J. Merelo

Introducción

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.

Cómo se usan las hojas de estilo

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:

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
  • Ejecutando hojas de estilo
  • Hoja de estilo básica: templates
  • xsl:stylesheet, xsl:apply-templates, xsl:value-of

Hojas de estilo básicas

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>

Procesándolo con Xalan

Para procesarlo con el Xalan, tendremos que hacer lo siguiente:

  1. Añadir la máquina virtual Java al PATH: unix$ export PATH=$PATH:/usr/bin/java (o donde quiera que esté)
  2. Añadir al CLASSPATH los .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)
  3. 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.

Procesándolo con Instant Saxon

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.

Explicación del código

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
  • Documentos XML con más etiquetas
  • Templates múltiples

Profundizando

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.

Bibliografía y enlaces relacionados con XSLT

Esta es la bibliografía que ha aparecido hasta el momento sobre el tema, especialmente en castellano

Hay también algunos tutoriales bastante buenos en inglés