XSLT (I)

XSLT es un lenguaje de programación declarativo que permite generar a partir de un documento XML una salida diferente. A menudo el documento generado es XML o HTML, pero en principio XSLT puede generar una salida arbitraria no necesariamente en estos lenguajes. Por ejemplo, un documento que contenga información sobre los empleados puede ser reestructurado para obtener todos los empleados que responden a un mismo criterio, como por ejemplo los que ganan una cierta cantidad. En XSLT 1.0 (versión que vamos a ver aquí) se exige que los archivos fuente deben ser documentos XML.

También se puede utilizar XSLT de forma que los datos extraidos del documento XML pasen a formar parte de otro documento HTML. Es habitual utilizar una base de datos relacional para almacenar los datos que se muestran en las páginas HTML, dadas las ventajas que esto ofrece, por ejemplo para mantener la consistencia de los datos. Tener los datos almacenados en formato XML también es eficiente, si a partir del documento XML se van a generar datos que pueden ser presentados en diferentes formatos.

XSLT emplea XPath para seleccionar las partes del documento XML fuente que después se van a usar en el documento generado. Uno de los usos principales de XSLT es la reestruccturación de documentos XML para ser compartido por dos organizaciones, que pese a que gestionan los mismos datos, emplean formatos diferentes. XSLT también es muy usado para presentar los datos de un documento XML en una página HTML o XHTML; por ejemplo, podemos tener un documento XML con gran cantidad de enlaces, organizados por tema o por fecha o algún otro criterio, y generar páginas HTML que contengan subconjuntos de estos enlaces, seleccionados según algún criterio. Otra aplicación muy conocida es la sindicación de contenidos, un servicio ofrecido por muchas páginas y que mejora la experiencia del usuario.

XSLT trabaja sobre una representación arbórea de la información del documento XML, llamada "árbol fuente". Partiendo de este árbol, XSLT procesa la información según las "plantillas" (templates) de la hoja de estilos XSLT, generando un "árbol resultado". A este proceso, se le conoce como "transformación". A partir del árbol resultado, XSLT genera un documento resultante.

PROGRAMACIÓN DECLARATIVA Y PROGRAMACIÓN PROCEDIMENTAL

La programación procedimental es la más intuitiva para el ser humano. La razón es que un programa es un conjunto de instrucciones, en orden, que indican lo que hay que hacer en cada momento. Es el tipo de programación de lenguajes como java, C, javascript... Es decir, se dice a la máquina CÓMO tiene que hacer las cosas. Sin embargo XSLT emplea otro paradigma de programación, llamado programación declarativa.

En el paradigma declarativo se olvida del CÓMO, y se centra en QUÉ se desea obtener. Es también el caso de SQL, el lenguaje estándar de consulta de bases de datos relacionales. Si no se tienen nociones de programación esto puede ser algo abstracto, pero ambos paradigmas (procedimental y declarativo) son usados en la vida diaria. Por ejemplo, si empleo el paradigma procedimental para enviar a alguien a la compra, le diré paso a paso lo que tiene que hacer, hasta volver a casa con la compra. En cambio, si empleo el paradigma declarativo, le entregaré sencillamente una lista de la compra, y dejaré que él tome las decisiones de cómo hacerlo.

Para especificar lo que el procesador XSLT va a hacer, habitualmente usaremos el elemento "xsl:template" con un atributo "match" que contiene el patrón relevante. Por ejemplo, si queremos crear una cierta salida sobre cada elemento "Capítulo" de un documento XML fuente, se podría escribir algo como esto:

<xsl:tamplate match="Capítulo"> <!-- El contenido del elemento <xsl:template> define qué se va a añadir al árbol resultado --> </xsl:template>

ELEMENTOS XSLT FUNDACIONALES

Vamos a ver un ejemplo que construye una página HTML partiendo de un documento fuente XML mostrado a continuación:

<Personas> <Persona> <Nombre>Linus Torvalds</Nombre> <Descripción>Linus Torvalds es un informático nacido en Helsinki que programó el kernel Linux y lo liberó en 1991.</Descripción> </Persona> <Persona> <Nombre>Richard Stallman</Nombre> <Descripción>Richard Stallman es un programador estadounidense y fundador del movimiento por el software libre en el mundo.</Descripción> </Persona> <Persona> <Nombre>Stephen Wozniak</Nombre> <Descripción>Stephen Gary Wozniak es un ingeniero electrónico estadounidense, cofundador de Apple, convertido en filántropo.</Descripción> </Persona> </Personas>

La siguiente hoja de estilos XSLT, que guardaremos como "Personas.xsl", crea una página web simple HTML, que contiene el nombre y descripción de las Personaas descritas en "Personas.xml":

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:template match="/"> <html> <head> <title> Información sobre <xsl:value-of select="count(/Personas/Persona)" /> Personas </title> </head> <body> <h3> Información sobre <xsl:value-of select="count(/Personas/Persona)" /> Personas </h3> <br/> <xsl:apply-templates select="/Personas/Persona" /> </body> </html> </xsl:template> <xsl:template match="Persona"> <h3> <xsl:value-of select="Nombre" /> </h3> <p> <xsl:value-of select="Descripción" /> </p> <br/> </xsl:template> </xsl:stylesheet>

El valor de los dos primeros casos, da al atributo "select" el valor "count(/Personas/Persona)". Es una ruta de localización XPath busca todos los elementos Persona hijos de Persona hijo del nodo raíz y los cuenta. Puesto que hay 3 de estos elementos Persona, el resultado es el siguiente:

donde pone:

<h3> Información sobre <xsl:value-of select="count(/Personas/Persona)" /> Personas </h3>

se genera:

<h3> Información sobre 3 Personas </h3>

También aparecen elementos <xsl:value-of> en el template que tiene match="Persona". El primero, <xsl:value-of select="Nombre" />, se refiere al nodo "Nombre" que es hijo del nodo de contexto. Dicho nodo de contexto es establecido por el elemento template (recordemos "/Personas/Persona"), de forma de forma absoluta, cuando decimos <xsl:value-of select="Nombre">, en realidad nos referimos a la ruta "/Personas/Persona/Nombre".

¿Por qué usar una ruta relativa en vez de una absoluta en xsl:value-of? La razón es que así nos aseguramos que solo se añadirá al árbol resultado el elemento "Nombre" del nodo Persona que se evalúa en cada momento. Si usáramos la ruta absoluta estaríamos refiriéndonos a todos los elementos "Persona hijos de Personas hijo de raíz".

xsl:value-of es la forma más simple en que XSLT extrae información de un árbol fuente. Sencillamente selecciona el valor de un node-set, que debe ser un solo nodo, especificado mediante la ruta XPath del atributo "select". Si hay más de un nodo en el node-set, el elemento xsl:value-of usa el valor del primer nodo según el orden del documento. Es decir, supongamos que modificamos el documento XML anterior, del siguiente modo, añadiendo un segundo nombre a Linus Torvalds.

<Personas> <Persona> <Nombre>Linus Torvalds</Nombre> <Nombre>Benedict</Nombre> <Descripción>Linus Torvalds es un informático nacido en Helsinki que programó el kernel Linux y lo liberó en 1991.</Descripción> </Persona> <Persona> <Nombre>Richard Stallman</Nombre> <Descripción>Richard Stallman es un programador estadounidense y fundador del movimiento por el software libre en el mundo.</Descripción> </Persona> <Persona> <Nombre>Stephen Wozniak</Nombre> <Descripción>Stephen Gary Wozniak es un ingeniero electrónico estadounidense, cofundador de Apple, convertido en filántropo.</Descripción> </Persona> </Personas>

Si le volvemos a pasar la hoja de estilos XSLT "Personas.xsl", entonces el elemento <xsl:value-of select="Nombre"> del último template ignorará la segunda aparición del elemento "Nombre". Haz la prueba.

Este elemento <xsl:value-of> es muy útil cuando estamos generando documentos HTML/XHTML a partir de documentos XML. Sin embargo para reestructurar documentos XML existen otros elementos más apropiados, como xsl:copy y xsl:copy-of.

Un par de ejemplos más:

Actividad 1. Crea una hoja de estilos que a partir del siguiente documento XML genere una página html:

<compra> <comprador> José Pérez</comprador> <fecha>6/6/10</fecha> <artículo> <referencia>2342</referencia> <nombre>Conector rj45</nombre> <cantidad>100</cantidad> </artículo> <dirección> C/Lamentos nº PI, Gotham, España. CP 234324 </dirección> </compra>

El resultado, debe ser un documento del siguiente tipo:

<H1> RESUMEN DE LA COMPRA </H1> 100 unidades del producto "Conector rj45" a enviar a la dirección "C/Lamentos nº PI, Gotham, España. CP 234324.

Actividad 2. Crea una hoja de estilos que a partir del siguiente documento XML genere una página htm:

<compras> <compra> <comprador> José Pérez</comprador> <fecha>6/6/10</fecha> <artículo> <referencia>2342</referencia> <nombre>Conector rj45</nombre> <cantidad>100</cantidad> </artículo> <dirección> C/Lamentos nº PI, Gotham, España. CP 234324 </dirección> </compra> <compra> <comprador> Antonio Pérez</comprador> <fecha>6/6/10</fecha> <artículo> <referencia>2343</referencia> <nombre>Carrete de 300 m. de par trenzado de categoría 6</nombre> <cantidad>1</cantidad> </artículo> <dirección> C/Suspiros nº PI, Gotham, España. CP 234324 </dirección> </compra> </compras>

El documento generado debe ser similar al siguiente:

<H1>RESUMEN DE LA COMPRA</H1> 100 unidades del producto "Conector rj45" a enviar a la dirección C/Lamentos nº PI, Gotham, España. CP 234324, a nombre de José Pérez <br/> 1 unidades del producto "Bobina de 300 m. de par trenzado de categoría 6" a enviar a la dirección C/Suspiros nº PI, Gotham, España. CP 234324, a nombre de Antonio Pérez <br/>

Guarda el ejercicio en un archivo llamado Act2-xslt.xsl

Saludos.