You are on page 1of 13

La tecnologa XML permite separar de manera efectiva los datos a almacenar, la estructura o semntica en la que se organizan y la presentacin de los

mismos. Aunque podemos visualizar un fichero XML con un simple editor de texto, no es la manera ms amigable ni profesional para presentar los datos que estn almacenados en su interior. Es ah donde debemos utilizar alguna herramienta que nos permita convertir y transformar los datos en el formato que deseemos. Esa herramienta se llama XSL (Extensible Stylesheet Language) XSL es a XML, lo que las hojas de estilo en cascada (CSS) a HTML (Aunque ya hemos visto tambin que se pueden aplicar hojas CSS a los documentos XML). XSL permite tomar pleno controlo sobre los datos, pudiendo establecerse criterios como qu datos ver, en qu orden visualizarlos, estableciendo filtros y definiendo formatos de salida para su representacin. Es, por tanto, una herramienta de procesado muy potente que hay que conocer en profundidad Para entrar dentro del contexto de la conversin y transformacin de ficheros XML, se define el siguiente ejemplo con cdigo XML que permitir almacenar un conjunto de libros en una librera: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet type="text/xsl" href="Libreria.xsl"?> <librera> <libro> <titulo>El Asedio</titulo> <autor>Arturo Prez Reverte</autor> <isbn>978-84-9964-108-93</isbn> <precio>23.08</precio> </libro> <libro> <titulo>IT</titulo> <autor>Stephen King</autor> <isbn>978-84-9964-108-94</isbn> <precio>20.06</precio> </libro> <libro> <titulo>El Padrino </titulo> <autor>Mario Puzo</autor> <isbn>978-84-9964-108-95</isbn> <precio>20.06</precio> </libro> </librera> Puede verse claramente que la librera puede contener un conjunto de libros. Cada libro tiene una serie de atributos propios como puede ser el ttulo, autores o ISBN. En el ejemplo anterior se ha almacenado

un libro y se quiere visualizarlo de una manera ms amigable. Se podra definir una XSL como la siguiente:

<?xml version='1.0' encoding='iso-8859-1'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h1>Mi Biblioteca</h1> <table> <tr bgcolor="#885588"> <th>Ttulo</th> <th>Autor</th> </tr> <xsl:for-each select="librera/libro"> <tr> <td><xsl:value-of select="titulo"/></td> <td><xsl:value-of select ="autor"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>

version="1.0"

Esta hoja de estilo XSL define que por cada libro almacenado en la librera, se aade una entrada en una tabla HTML con los valores del ttulo y el nombre del autor. El resultado de vincular al XML una hoja de estilo XSL permite obtener u resultado como el siguiente:

ste es un pequeo ejemplo de conversin. En principio se puede transformar un documento XML a otro XML o cualquier otro distinto que pueda ser reconocido por un navegador web (HTML o XHTML) Si se quiere utilizar correctamente esta tecnologa de representacin de documentos XML se deben seguir los siguientes pasos:

1. Tener bien definido el documento XML 2. Crear una hoja de estilo XSL bien formada 3. Vincular al documento XML la hoja de estilo XSL. Los dos primeros puntos se asumen cumplidos al estar determinados por los DTDs o esquema definidos anteriormente. Adems se indica sobre qu espacio de nombres se trabja por lo que es fcil cumplir las dos condiciones iniciales. Para vincular en un documento XML una hoja de estilo XSL cualquiera, por ejemplo Librera.xsl hay que aadir al fichero XML lo siguiente: <?xml-stylesheet type="text/xsl" href="Libreria.xsl"?>, Debajo de la instruccin inicial de procesamiento Cumplidos los pasos anteriores, el procesador de documentos XSL comienza a recorrer el rbol del documento XML. Se inicia por el nodo raz y se ir recorriendo todo el rbol haciendo que cada parte del documento XML pueda tener un formato especfico(rbol de resultados). Pero, cmo determinar qu formatos tendrn cada una de las partes del documento? La respuesta a la pregunta es la definicin de plantillas en la hoja de estilos. Una plantilla es un patrn que cuando se cumple puede generar resultados de formatos en el rbol final. Es decir, con un documento de origen que se recorre por completo buscando concordancias con las plantillas definidas, de manera que si se cumple alguna, se aplica el formato definido y se genera en el rbol del documento final. Actividad 1. Insertar varios libros ms en el fichero XML indicado cuyo coste sea inferior a 10,50 . 2. Insertar el dato nmero de paginas en cada libro contenido en el fichero XML inicial. Por ejemplo ser <numPaginas>150</numPaginas> 3. Cambiar el ttulo de la tabla a Mi Biblioteca personal 4. Cambiar el color de la tabla en el fichero XSL 5. Aadir una columna ms al final en la que se muestre el precio del libro. 6. Aadir una columna ms al principio en la que se muestre el ISBN

TRANSFORMACIN DE DOCUMENTOS (XSL) XSL es un lenguaje que nos permite definir un conjunto de reglas que, aplicados sobre un documento XML, permite transformarlo en un resultado formateado ms adecuado a nuestros intereses. Para ello,

se necesita almacenar esas reglas dentro de un fichero llamado hoja de estilo XSL. El fichero que almacena la hoja de estilo XSL como fichero XML que es, debe estar bien formado. Usando el ejemplo anterior de los libros, se puede ver que el fichero XSL posee una declaracin inicial que determina su contenido como XML y su codificacin. A continuacin se indica la etiqueta que identifica al fichero XSL y el espacio de nombres en el que se basa. En este caso tenemos dos opciones: <?xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform?> <?xsl transform xmlns:xsl=http://www.w3.org/1999/XSL/Transform?> version=1.0 version=1.0

Las dos maneras estn soportadas en el estndar establecido en el consorcio W3C y se han elevado a recomendaciones de uso. Se puede observar que, independientemente de la que se utilice, ambas hacen referencia a un espacio de nombres comn en su versin 1.0 La siguiente etiqueta interesante es la permite definir un elemento plantilla dentro del XSL. Todo lo que quede entre las siguientes etiquetas: <xsl:template match=/> </xsl:template> Ser lo que permitir generar la salida formateada. Cabe destacar que con esta etiqueta se puede indicar sobre qu parte del documento XML se quiere actuar, utilizando el atributo match para ello. En este caso se ha querido actuar sobre la raz del propio documento XML ELEMENTOS BSICOS XSL:FOR-EACH En este momento tenemos en el fichero XML un conjunto de libros bien identificados. Es posible que al usuario final le interese recorrerse todos y cada uno de los libros y extraer los datos para darles un nuevo formato. Eneste caso, la siguiente etiqueta indica que se recorran todo el conjunto de elementos XML que sean libros <xsl:for-each select=librera/libro> </xsl:for-each> XSL:VALUE-OF

Finalmente queda extraer el contenido del libro. Para ello, la etiqueta que extrae la informacin de ese elemento XML seleccionado es la siguiente: <xsl:value-of select=titulo/> sta es la manera ms sencilla de realizar un listado complete, formateado y con estilos adecuados, de todos los libros almacenados en la biblioteca. Aunque este ejemplo es muy simple, la potencia de las hojas de estilo XSL no acaba con estos elementos XSL:SORT En este momento, el lector podra indicar que tiene tantos libros almacenados que resultara muy interesante mostrarlos de manera ordenada (Y no tal y como se salvaron en el fichero XML) Si lo que interesa es el ttulo del libro, tras la etiqueta for-each, inclumos esta: <xsl:sort select=titulo/> El resultado ser:

Si por el contrario, el orden adecuado es por autor, entonces se debera incluir la siguiente: <xsl: sort select=autor/>

(Coincide con la anterior porque los ttulos y autores implican la misma ordenacin en estos tres libros concretos) Lo realmente interesante es que se puedan realizar bsqueda con determinados patrones preestablecido. En este caso, parece lgico pensar que en vez de recorrerse todos los elementos, deberamos filtrar por ese patrn (independientemente del orden que establezcamos) Si por ejemplo queremos extraer todos los libros del autor Arturo Prez Reverte, se podra cambiar lo siguiente: <xsl:for-each select=librera/libro[autor=Arturo Prez Reverte]> . </xsl:for-each>

Si, por el contrario, lo que interesa es realizar una bsqueda con otro operador, como por ejemplo, todos los libros en los que el autor no es Stephen King, ordenado por autor, el cambio sera tan simple como ste: <xsl:for-each select=librera/libro[autor!=Stephen King]> <xsl:sort select=autor/> . </xsl:for-each>

ACTIVIDADES

1. Sin ningn patrn de bsqueda establecido, ordenar los resultados por precio. 2. Insertar en el fichero XML que se indicia inicialmente, un nuevo libro cuyo autor sea el mismo a uno ya incluido anteriormente 3. Buscar los libros del autor anterior y comprobar que salen todos sus libros (ordenados por precio) 4. Buscar todos lo libros que nos son del autor anterior. Comprobar que en los resultados faltan sus libros. OPERADORES EN XSL ELEMENTO XSL:IF Hasta este momento, se han visto operadores de igualdad y desigualdad para cambiar el patrn de bsqueda pero no son los nicos que existe. Podran usarse tambin los siguientes: Los operadores lgicos que s epueden utilizar para cambiar el patrn de bsqueda o filtro son los siguientes: - Operador de igualdad (=) - Operador de desigualdad (!=) - Operador menor que: (&lt;) - Operador mayor que: (&gt;) En ocasiones se necesita mayor potencia a la hora de establecer un patrn de bsqueda. Los operadores lgicos vistos anteriormente son efectivos para filtros simples pero tambin existe la posibilidad de indicar con el elemento <xsl:if>, condiciones ms complejas en la evaluacin del fichero XML. La sintaxis de este nuevo elemento es la siguiente: <xsl:if test=expresin> . </xsl> Imaginemos que queremos mostrar todos aquellos libros cuyo coste sea superior a 12 euros. Para ello, solo modificaremos las siguientes lneas del fichero XSL: <xsl:for-each select=librera/libro> <xsl:if test=precio &gt; 21> . </xsl:if </xsl:for-each> Ejemplo:

Aadir el fichero XML inicial (ejemplo 5.1), dos libros de un Nuevo autor. Sus precios sern 10.50 y 12.50 respectivamente Realizar un fichero XSL que busque todos aquellos libros cuyo coste sea superior a 10 . Asegurarse que aparecen los libros del autor nuevo. En el mismo fichero XSL anterior, aadir una condicin en la que solo se muestren aquellos cuyo autor sea el ltimo que se ha definido Cambiar la condicin del coste del libro. Ahora slo se quieren aquellos libros cuyo coste sea superior a 12 . Comprobar que slo aparece un libro de los dos anteriores aadidos

ELEMENTO XSL:CHOOSE El elemento xsl:if no es la nica manera de condicionar los resultados. Existe otro elemento que nos permite establecer mltiples condiciones dentro del recorrido del rbol XML. El elemento <xsl:choose> es muy similar a la instruccin switch de C/C++/Java o case de Pascal. Se pueden establecer tantas expresiones condicionales como se quieran los elementos <xsl:when>. Si se quiere establecer una condicin por defecto, el elemento a utilizar sera <xsl:otherwise> La sintaxis quedara como sigue: <xsl:choose> <xsl:when test=expresion> </xsl:when> <xsl:when test=expresion> . </xsl:when> <xsl:when test=expresion> </xsl:when> <xsl:otherwise>

. </xsl:otherwise> </xsl:choose> Siguiendo con el ejemplo inicial, estableceremos una condicin nueva en la que si el precio del libro es menor de 12 Euros muestre en color rojo todos sus datos. Si es mayor de 21, en color verde. Y si no se cumple ninguna de las anteriores, en color azul. Esto se realizara de la siguiente manera: <?xml version='1.0' encoding='iso-8859-1'?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h1>Mi Biblioteca</h1> <table> <tr bgcolor="#889988"> <th>Ttulo</th> <th>Autor</th> <th>Precio</th> </tr> <xsl:for-each select="librera/libro"> <xsl:choose> <xsl:when test ="precio &lt; 12"> <tr> <td bgcolor="#ff0000"><xsl:value-of select="titulo"/></td> <td bgcolor="#ff0000"><xsl:value-of select ="autor"/></td> <td bgcolor= "#ff0000"><xsl:value-of select="precio"/></td> </tr> </xsl:when> <xsl:when test ="precio &gt; 21"> <tr> <td bgcolor="#00ff00"><xsl:value-of select="titulo"/></td> <td bgcolor="#00ff00"><xsl:value-of select ="autor"/></td> <td bgcolor= "#00ff00"><xsl:value-of select="precio"/></td> </tr> </xsl:when> <xsl:otherwise> <tr> <td bgcolor="#0000ff"><xsl:value-of select="titulo"/></td> <td bgcolor="#0000ff"><xsl:value-of select ="autor"/></td> <td bgcolor= "#0000ff"><xsl:value-of select="precio"/></td> </tr> </xsl:otherwise>

</xsl:choose> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>

Que da como resultado:

ACTIVIDADES 1. Aadir al fichero XML inicial dos libros de un nuevo autor. Sus precios sern 10.50 Euros y 60.50 Euros respectivamente 2. Comprobar con el fichero XSL indicado que los nuevos libros se pintan del color indicado 3. Aadir las columnas precio al final e ISBN al principio de la tabla de resultados 4. Cambiar los colores para que si el coste es mayor que 21 Euros sean de color rojo y verde si es menor que 25 LAS PLANTILLAS Hasta el momento solo hemos utilizado una nica plantilla para todo el documento XML. Se habl del elemento <xsl:template> como etiqueta que permita definir sobre qu parte del documento XML se quera actuar. Si se observan con detenimiento todos los ejemplos anteriores, el atributo match referenciaba siempre la raz del documento XML, no estableciendo distincin entre otras ramas o

elementos que lo componene. A continuacin se muestra un cambio radical en el fichero xsl para que usando distintas plantillas, se pueda ver el nombre del autor en gris claro y el ttulo del libro en otro ms oscuro(sin ningn elemento condicional por simplicidad del ejemplo (Lgicamente habra que poner en el XML original el enlace a esta nueva hoja de estilos) <?xml version="1.0" encoding ="ISO-8859-1" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html><body> <h1>Ejemplo plantillas</h1> <xsl:apply-templates/> </body></html> </xsl:template> <xsl:template match="librera"> <h2>Mi biblioteca</h2> <table> <tr bgcolor="#889988"> <th>Ttulo</th> <th>Autor</th> <th>Precio</th> </tr> <xsl:apply-templates select="libro"/> </table> </xsl:template> <xsl:template match="libro"> <tr> <td><xsl:apply-templates select="titulo"/></td> <td><xsl:apply-templates select="autor"/></td> <td><xsl:apply-templates select="precio"/></td> </tr> </xsl:template> <xsl:template match="titulo"> <td bgcolor="#DDEEDD"><xsl:value-of select="."/></td> </xsl:template> <xsl:template match="autor"> <td bgcolor="#AABBAA"><xsl:value-of select="."/></td> </xsl:template> <xsl:template match="precio"> <td bgcolor="#CCFFCC"><xsl:value-of select="."/></td> version="1.0"

</xsl:template> </xsl:stylesheet>

Que da como resultado (Abierto en Firefox):

En este ejemplo se puede observar que se han establecido seis plantillas personalizadas para los elementos /, librera, libro, titulo, autor y precio. Cuando se llame a esta hoja de estilos desde un documento XML, se intentar reconocer los patrones de las plantillas, sustituyendo en la salida los contenidos que se indiquen por cada plantilla Se debe destacar una serie de elementos que no se han explicado anteriormente y que permiten la aplicacin directa de la plantilla en el documento final: <xsl:apply-templates/> : Indica que se apliquen el resto de las plantillas definidas en cuanto se cumplan el patrn match de cada una. <xsl:apply-templates select=XXXX/> Indica que se aplique en ese momento el contenido de la plantilla XXXX definida en el documento XML <xsl:value-of select=./>: En el nodo XML actual de la plantilla actual, indica que se copie el valor que contenga ese nodo. Por ejemplo, si el nodo actual es de tipo titulo, insertar como resultado el ttulo del libro actual.

El proceso seguido cuando se recorre un documento XML desde una transformacin XSL, siempre es el mismo. Intuitivamente empieza a recorrerse el fichero xML desde su nodo raz, aplicando en ese momento la plantilla asociada. En el ejemplo anterior se utiliza la plantilla /, generando un esqueleto de documento HTML vlido. El elemento <xsl:apply-templates/> que est situado en la plantilla /, indica que se recorra todos y cada uno de los nodos definidos en el fichero XML aplicando las plantillas definidas. Si en este recorrido del documento XML se encuentra el elemento librera, aplicar la plantilla del mismo nombre definida en el fichero XSL. Es importante resear que cuando se aplica la plantilla librera, se establecen las propiedades y etiquetas HTML necesarias para crear una tabla de datos. Esta tabla contendr datos en su interior por lo que el elemento <xsl:apply-templates select=libro/> indicar que, cuando se reconozca un nodo XML libro, se aplique la plantilla definida para ello. La misma explicacin tienen la aplicacin de las plantillas titulo y autor. Finalmente, si en el recorrido del documento XML se encuentra sobre un nodo titulo o autor, se aplicar su plantilla correspondiente, con la salvedad que en esos nodos se requiere la extraccin de la informacin para el documento final. Esa funcionalidad vendr dada por el elemento <xsl:value-of select=. />, copiando el valor de ese nodo y envindolo al documento HTML final Podemos ver, por tanto, el recorrido del documento XML como un conjunto de llamadas a procedimientos (plantillas), que segn el caso, integrarn datos de salida en el documento final ACTIVIDADES Insertar el dato nmero de pginas en cada libro contenido en el fichero XML inicial. Por ejemplo, el elemento ser <numPaginas>150</numPaginas> Aadir las columnas precio y nmero de pginas al final de la tabla de resultados Aadir la columna ISBN al principio de la tabla de resultados Aadir al fichero XSL una plantilla nueva para cambiar el estilo del elemento numPaginas para que se muestre en rojo si el libro tiene ms de 150 pgina Comprobar los resultados obtenidos comparndolo con los datos almacenados en el fichero XML