5.1 Introducción a XSL Añadir Forma al Contenido (I)! Un documento XML que cumple las normas del dialecto ListaML: <listas> <lista nombre= ESIDE-TIM desc= Lista de TiM > <subs mail= 1jolopez@rigel.deusto.es /> <subs mail= 3jugonza@rigel.deusto.es /> </lista> <lista nombre= AMIGOS desc= Lista de amigos > <subs mail= colegui@mixmail.com /> <subs mail= compi@hotmail.com /> <subs mail= amiguete@wanadoo.es /> </lista> </listas> 2002 Borja Sotomayor 1
Añadir Forma al Contenido (II)! Es un documento XML bien formado y válido... Genial!! Sin embargo, si intentamos visualizar este documento en Internet Explorer, en Mozilla, etc. lo único que veremos será... el documento XML!! Según el navegador, a veces veremos el contenido de las etiquetas del documento.! Por qué? Añadir Forma al Contenido (III)! El navegador web reconoce HTML y XHTML.! P.ej.: Sabe que cuando se encuentra con una etiqueta <table> tiene que empezar a dibujar una tabla.! El navegador web no reconoce las etiquetas de nuestro lenguaje (<lista> <subs> le suenan a Chino y las ignora)! Cómo podemos conseguir que el navegador web reconozca nuestro dialecto y lo visualice de una cierta manera? (p.ej. en una tabla) 2002 Borja Sotomayor 2
Añadir Forma al Contenido (IV)! Una posible solución " Cada vez que se crea un nuevo dialecto XML, se notifica a los fabricantes de navegadores web para que incluyan en su producto un motor de visualización.! Esto, obviamente, es una locura. El numero de dialectos XML existentes es demasiado grande y no se puede estar al tanto de todos ellos. Añadir Forma al Contenido (V)! Solución: encargarnos nosotros mismos de aplicar una forma al contenido. Es decir, indicar de alguna manera al navegador web cómo debe presentarse visualmente la información contenida en el documento XML (por pantalla, la impresora, etc.). 2002 Borja Sotomayor 3
Añadir Forma al Contenido (VI)! Sin embargo, hay que tener en cuenta una cosa: la mayoría de los dialectos XML son dialectos orientados al contenido. Es decir, almacenan únicamente datos y ninguna información sobre la presentación de los datos. Añadir Forma al Contenido (VII)! Entonces... cómo añadimos esta información sobre presentación (la forma) sin contaminar el documento XML?! El documento XML sólo debe almacenar el contenido!!! Solución " XSL (extensible Stylesheet Language) 2002 Borja Sotomayor 4
XSL (I)! XSL es una tecnología XML que se compone de dos dialectos XML:! XSLT! XSL-FO! Cómo nos ayuda cada una a añadir forma a nuestro contenido? XSL (II)! XSLT " Es un lenguaje que nos permite transformar un documento XML de un dialecto a otro.! Podemos transformar un dialecto XML orientado al contenido (ListaML) a un dialecto orientado a la presentación (XHTML, por ejemplo, para presentación en la web) 2002 Borja Sotomayor 5
XML (ListaML) XML (XSLT) Hoja de Transformación XML (XHTML) El navegador web no sabe visualizarlo El navegador web sabe visualizarlo! La Hoja de Transformación es un documento XML en el que se especifican unas transformaciones utilizando el lenguaje XSLT.! Podemos especificar unas transformaciones que convierten un documento ListaML en un documento XHTML.! Para llevar a cabo dicha conversión aplicamos la hoja de transformación al documento ListaML. XSL (III)! Ojo! Se ha hablado mucho de que el navegador web sabe o no sabe visualizar un documento. Los navegadores web no son los únicos programas capaces de visualizar dialectos XML (de hecho, los últimos navegadores web sólo visualizan dialectos XML orientados a web, como XHTML).! El termino correcto es agente de usuario (User Agent) o agente de visualización. 2002 Borja Sotomayor 6
XSL (IV)! Por ejemplo, hay agentes que visualizan CML (Chemical Markup Language) o MathML (formulas matemáticas). Igual que el navegador web, estos agentes no entenderían nuestro lenguaje ListaML ( pero tampoco entenderían XHTML!) XSL (V)! XSL-FO " Es un lenguaje que nos permite especificar directamente el formato de un documento:! Páginas, tablas, cabeceras, etc.! Obviamente, es un dialecto XML orientado a la presentación. 2002 Borja Sotomayor 7
5.2 XSLT: Introducción Introducción (I)! Ejemplo. Partimos del siguiente documento ListaML: <listas> <lista nombre= ESIDE-TIM > <subs mail= 1jolopez@rigel.deusto.es /> <subs mail= 3jugonza@rigel.deusto.es /> </lista> <lista nombre= AMIGOS > <subs mail= colegui@mixmail.com /> <subs mail= compi@hotmail.com /> <subs mail= amiguete@wanadoo.es /> </lista> </listas> 2002 Borja Sotomayor 1
Introducción (II)! Ya hemos dicho antes que este documento no puede ser visualizado en un navegador web (en general: en cualquier User Agent que no entienda el dialecto ListaML )! Si lo transformamos a XHTML, sí podríamos visualizarlo en un navegador web. Introducción (III)! Cómo hacemos esta transformación? Especificando reglas de transformación.! Regla de transformación: Especifica los cambios que han de realizarse a una entidad A para que se convierta en una entidad B.! Para transformar nuestro documento ListaML a XHTML podríamos especificar 3 reglas de transformación. 2002 Borja Sotomayor 2
Queremos que el resultado de toda la transformación sea un documento XHTML. Por lo tanto, habrá que transformar el elemento raíz <listas> en algo que se parezca a un documento XHTML: <listas>... </listas> <html> <head> <title>listas de Distribucion</title> </head> <body>... </body> </html> 1ª Regla de Transformación: El elemento <listas> pasa a convertirse en el esqueleto de un documento XHTML. Ojo! Si sólo aplicamos la 1ª regla obtenemos esto: <html> <head> <title>listas de Distribucion</title> </head> <body> <lista nombre= ESIDE-TIM > <subs mail= 1jolopez@rigel.deusto.es /> <subs mail= 3jugonza@rigel.deusto.es /> </lista> <lista nombre= AMIGOS > <subs mail= colegui@mixmail.com /> <subs mail= compi@hotmail.com /> <subs mail= amiguete@wanadoo.es /> </lista> </body> </html> Sólo hemos transformado el elemento <listas>! El resto del documento no ha sido modificado (se ha introducido tal cual en el esqueleto HTML ). Obviamente, esto todavía no es un documento XHTML. Hay que aplicar más reglas de transformación. 2002 Borja Sotomayor 3
Si queremos que las listas se presenten en una tabla XHTML, podemos transformar el elemento <lista> en una tabla cuya primera fila contiene el nombre de la lista. <lista nombre= nombre_lista >... </lista> <table border="1"> <tr><th>lista nombre_lista</th></tr>... </table> 2ª Regla de Transformación: El elemento <lista> pasa a convertirse en el esqueleto de una tabla XHTML. Si aplicamos la 1ª y 2ª regla tenemos lo siguiente: <html> <head> <title>listas de Distribucion</title> </head> <body> <table border="1"> <tr><td>lista ESIDE-TIM</td></tr> <subs mail= 1jolopez@rigel.deusto.es /> <subs mail= 3jugonza@rigel.deusto.es /> </table> <table border="1"> <tr><td>lista AMIGOS</td></tr> <subs mail= colegui@mixmail.com /> <subs mail= compi@hotmail.com /> <subs mail= amiguete@wanadoo.es /> </table> </body> </html> 2002 Borja Sotomayor 4
Si hemos transformado el elemento <lista> en el esqueleto de una tabla XHTML, entonces tiene sentido que el elemento <subs> sea transformado en filas para esa tabla. <subs mail= dir_mail /> <tr> <td>dir_mail</td> </tr> 3ª Regla de Transformación: El elemento <subs> pasa a convertirse en una fila de una tabla XHTML. Finalmente, si aplicamos todas las reglas: <html> <head> <title>listas de Distribucion</title> </head> <body> <table border="1"> <tr><td>lista ESIDE-TIM</td></tr> <tr><td>1jolopez@rigel.deusto.es</td></tr> <tr><td>3jugonza@rigel.deusto.es</td></tr> </table> <table border="1"> <tr><td>lista AMIGOS</td></tr> <tr><td>colegui@mixmail.com</td></tr> <tr><td>compi@hotmail.com</td></tr> <tr><td>amiguete@wanadoo.es</td></tr> </table> </body> </html> Un documento XHTML válido y bien formado! 2002 Borja Sotomayor 5
Introducción (III)! La transformación que hemos hecho paso a paso en este ejemplo la podemos hacer con XSLT.! XSLT nos permite especificar formalmente las reglas de transformación.! Las reglas de transformación estarán en un documento llamado hoja de transformación. Introducción (IV) XML (ListaML) Regla 1 Regla 2 Regla 3 Hoja de Transformación XML (XHTML) El navegador web no sabe visualizarlo El navegador web sabe visualizarlo! La hoja de transformación es un documento XML ( no olvidemos que XSLT también es un dialecto XML!) 2002 Borja Sotomayor 6
Introducción (V)! Para vincular una hoja de transformación a un documento XML tenemos que añadir la siguiente instrucción de procesamiento en el documento XML: <?xml-stylesheet type= text/xml href= URL?> Introducción (VI)! En la Web, la transformación la puede realizar:! El servidor web! El cliente (el navegador web)! Es preferible que se encargue el servidor web, ya que no todos los navegadores web están totalmente preparados para realizar transformaciones XSLT. 2002 Borja Sotomayor 7
Aplicaciones de XSLT (I)! XSLT es un lenguaje muy potente.! Curiosidad: Se ha demostrado que XSLT es un lenguaje Turing-Completo.! Pueden especificarse transformaciones muy complejas.! Las transformaciones que hemos hecho en el ejemplo no son más que la punta del iceberg. Aplicaciones de XSLT (II)! XSLT tiene principalmente tres aplicaciones:! XML contenido " XML presentación Convertir de un dialecto XML orientado al contenido a otro orientado a la presentación. Lo que conseguimos es añadir forma al contenido. Es lo que hemos hecho en el ejemplo. De cara a la Web, es la principal aplicación de XSLT. 2002 Borja Sotomayor 8
Aplicaciones de XSLT (III)! XML contenido " XML contenido XML se utiliza mucho como soporte para almacenar datos (sin que necesariamente luego tengan que ser presentados visualmente). Es una aplicación inesperada de XML, pero que está cobrando mucha importancia y protagonismo. Por eso mismo, resulta interesante poder convertir un dialecto orientado al contenido a otro dialecto también orientado al contenido. Aplicaciones de XSLT (IV) Ejemplo: Supongamos que una compañía con la que trabajamos almacena la información sobre sus listas de distribución utilizando un dialecto XML llamado DistroListML. Con XSLT podemos crear una hoja de transformación que convierta nuestros documentos ListaML a DistroListML. De esta manera, las dos compañías consiguen compartir datos fácilmente. 2002 Borja Sotomayor 9
Aplicaciones de XSLT (V)! XML " No XML Podemos utilizar XSLT para convertir un documento XML (orientado al contenido o a la presentación) en un documento no-xml. Por ejemplo, utilizando XSLT podemos convertir XML a:! Imágenes 2D y 3D! Documentos PDF! Código fuente de un programa! Formatos ad hoc Estas hojas de transformación (sobre todo las que convierten un documento XML en una imagen) son bastante complicadas y difíciles de programar. 2002 Borja Sotomayor 10
5.3 XSLT: Estructura Básica Elemento Raíz (I)! XSLT es un dialecto XML.! Hoja de Transformación " Un documento XML que cumple las normas del dialecto XSLT.! El elemento raíz de este documento XML es: <xsl:stylesheet>... </xsl:stylesheet> 2002 Borja Sotomayor 1
Elemento Raíz (II)! El elemento raíz tiene dos atributos obligatorios:! version= numero_version! Actualmente sólo hay tres posibles números de versión: 1.0, 1.1, y 2.0! xmlns:xsl= http://www.w3.org/1999/xsl/transform! El valor de este atributo debe escribirse exactamente así. De lo contrario, la hoja de transformación no funcionará. Reglas de Transformación (I)! El elemento raíz puede contener varios `elementos de primer nivel.! El más importante es <xsl:template>... </xsl:template>! Cada elemento xsl:template es una regla de transformación. 2002 Borja Sotomayor 2
Reglas de Transformación (II)! El elemento xsl:template tiene un atributo match con el que especificamos qué debe transformar la regla.! Por ejemplo: <xsl:template match= lista >... </xsl:template> es una regla de transformación para el elemento lista Reglas de Transformación (III)! Cuando el procesador XSLT se encuentra en el documento XML un elemento que cumpla la condición especificada en el match, lo substituye por lo que sea que haya dentro del <xsl:template>.! El atributo match toma el valor de una dirección XPath. 2002 Borja Sotomayor 3
<tienda> <articulo precio= 35000 >Impresora</articulo> <articulo precio= 20000 >Disco Duro</articulo> <articulo precio= 47000 >Monitor</articulo> </tienda> + <xsl:stylesheet... > <xsl:template match= articulo > Esto es un articulo </xsl:template> </xsl:stylesheet> = Esto es un articulo Esto es un articulo Esto es un articulo Todos los elementos <articulo> son substituidos por el texto Esto es un articulo El Procesador XSLT (I)! Pero si yo tengo el siguiente documento XML: <cineasta nombre= Woody Allen > <peliculas>... </peliculas> <influencias> <cineasta nombre= Ingmar Bergman /> <cineasta nombre= Groucho Marx /> </influencias> </cineasta> y defino una regla de transformación con match= cineasta... qué elementos serán transformados? 2002 Borja Sotomayor 4
El Procesador XSLT (II)! Todos?! El primer elemento (Woody Allen)?! Los últimos (Bergman + Marx)?! match= cineasta? Si cineasta es una dirección XPath, Cual es el contexto?! Para resolver este tipo de problemas, conviene saber como aplica exactamente las reglas de transformación el procesador XSLT. El Procesador XSLT (III)! La transformación del documento es un proceso recursivo.! Primero intenta transformar el elemento raíz. Si existe una regla de transformación definida para el elemento raíz, la aplica. Si no aplica una regla por defecto, e intenta transformar a los hijos del elemento raíz. 2002 Borja Sotomayor 5
El Procesador XSLT (IV)! Por cada hijo, si se ha definido una regla de transformación, se aplica. Si no, aplica una regla por defecto, e intenta transformar a los hijos del elemento. Este proceso se repite hasta que se agotan los hijos.! Ojo! Si un elemento efectivamente tiene definida una regla de transformación, ésta se aplica y los hijos no son transformados a no ser que lo solicitemos explícitamente. Informalmente, el algoritmo que sigue es: función Transformar(nodo) { Si existe regla de transformación para nodo en contexto entonces contexto # nodo Aplicar regla de transformación Si no contexto # nodo Aplicar regla por defecto Por cada hijo de nodo hacer Transformar(hijo) fin Por cada fin Si } main() { contexto # Nodo raíz Transformar(contexto) } Ojo! La expresión contexto # nodo no es estrictamente correcta. En XSLT, el contexto no depende exclusivamente del nodo actual sino de más parámetros, especialmente cuando se tiene que determinar si existe regla de transformación para nodo en contexto. Sin embargo, en la mayoría de los casos este algoritmo es válido. 2002 Borja Sotomayor 6
<cineasta nombre= Woody Allen > <peliculas>... </peliculas> <influencias> <cineasta nombre= Ingmar Bergman /> <cineasta nombre= Groucho Marx /> </influencias> </cineasta> Si definimos una regla de transformación para cineasta entonces sólo será transformado el elemento raíz cineasta. Sus hijos serán ignorados. 2002 Borja Sotomayor 7
5.4 XSLT: Instrucciones Básicas Instrucciones XSLT (I)! Antes hemos visto una regla de transformación muy sencilla: <xsl:stylesheet... > <xsl:template match= articulo > Esto es un articulo </xsl:template> </xsl:stylesheet>! Obviamente, en una transformación no vamos a limitarnos a sustituir elementos por texto. Querremos hacer cosas como:! Acceder al contenido del elemento.! Acceder a los atributos del elemento.! Decidir si queremos transformar también los hijos. 2002 Borja Sotomayor 1
Instrucciones XSLT (II)! Esto se consigue con las instrucciones XSLT, que están contenidas dentro de las reglas de transformación (<xsl:template>) xsl:value-of (I)! Para mostrar el texto de un elemento, el valor de un atributo, etc. utilizamos <xsl:value-of select= exp_xpath />! exp_xpath es una expresión XPath (no necesariamente tiene que devolver un nodo)! Ojo! Si exp_xpath devuelve un nodo, entonces el texto que aparecerá en el documento resultante será el valor del nodo.! Si devuelve varios nodos, solo se tiene en consideración el primer nodo. 2002 Borja Sotomayor 2
xsl:value-of (II)! Valores! Elemento: Concatenación de el valor de sus nodos texto y de los nodos texto de sus descendientes. La concatenación se realiza tal cual aparece en el documento XML original.! Nodo Raíz: Valor del elemento raíz.! Atributo: El propio valor del atributo. xsl:value-of (III)! Comentarios: El texto contenido entre <! y -->! Instrucciones de proceso: El texto contenido entre <? y?> pero sin el nombre de la instrucción de proceso. 2002 Borja Sotomayor 3
<tienda> <articulo precio= 35000 >Impresora</articulo> <articulo precio= 20000 >Disco Duro</articulo> <articulo precio= 47000 >Monitor</articulo> </tienda> + <xsl:stylesheet... > <xsl:template match= articulo > <xsl:value-of select=. /> </xsl:template> </xsl:stylesheet> = Impresora Disco Duro Monitor Todos los elementos <articulo> son substituidos por su valor ( ojo con el contexto!!) <tienda> <articulo precio= 35000 >Impresora</articulo> <articulo precio= 20000 >Disco Duro</articulo> <articulo precio= 47000 >Monitor</articulo> </tienda> + <xsl:stylesheet... > <xsl:template match= articulo > <xsl:value-of select= @precio /> </xsl:template> </xsl:stylesheet> = 35000 20000 47000 Todos los elementos <articulo> son substituidos por el valor de su atributo precio 2002 Borja Sotomayor 4
xsl:value-of (IV)! Y si queremos insertar un valor dentro de un atributo? Por ejemplo: <tienda> <articulo>impresora</articulo> <articulo>disco Duro</articulo> <articulo>monitor</articulo> </tienda> <tienda> <articulo nombre= Impresora /> <articulo nombre= Disco Duro /> <articulo nombre= Monitor /> </tienda> Cómo? xsl:value-of (V)! En principio, se nos podría ocurrir hacerlo así: <xsl:stylesheet... > <xsl:template match= articulo > <articulo nombre= <xsl:value-of select=. /> > </xsl:template> </xsl:stylesheet> 2002 Borja Sotomayor 5
xsl:value-of (VI)! No! Hay que poner la expresión XPath entre corchetes y dentro del valor del atributo: <xsl:stylesheet... > <xsl:template match= articulo > <articulo nombre= {.} /> </xsl:template> </xsl:stylesheet> xsl:apply-templates (I)! Para alterar el flujo de la transformación, en una regla podemos pausar la transformación actual y aplicar reglas a otro/s nodo/s.! Especificamos estos otros nodos con una dirección XPath.! Si nos fijamos en el algoritmo, es como si pudiésemos invocar nosotros mismos a la función Transformar(nodo) 2002 Borja Sotomayor 6
xsl:apply-templates (II)! Para hacer esto, utilizamos: <xsl:apply-templates select= dir_xpath /> <tienda> <articulo precio= 35000 >Impresora</articulo> <articulo precio= 20000 >Disco Duro</articulo> </tienda> + <xsl:stylesheet... > <xsl:template match= tienda > Los articulos de mi tienda son: <ol> <xsl:apply-templates select= articulo /> </ol> </xsl:template> <xsl:template match= articulo > <li><xsl:value-of select=. /></li> </xsl:template> </xsl:stylesheet> 2002 Borja Sotomayor 7
xsl:apply-templates (III)! El resultado es: Los articulos de mi tienda son: <ol> <li>impresora</li> <li>disco Duro</li> </ol> xsl:apply-templates (IV)! Si omitimos el atributo select, sencillamente se transforman todos los nodos hijos del contexto. <xsl:apply-templates /> 2002 Borja Sotomayor 8
xsl:apply-templates (V)! xsl:apply-templates y xsl:template tienen un atributo llamado mode, que me permite definir distintos modos de transformación.! Es decir, yo puedo especificar más de una regla de transformación para una misma dirección XPath, distinguiendo las reglas con el atributo mode. xsl:apply-templates (VI)! Por ejemplo: <xsl:template match= articulo mode= negrita > <b><xsl:value-of select=. /></b> </xsl:template> <xsl:template match= articulo mode= cursiva > <i><xsl:value-of select=. /></i> </xsl:template> 2002 Borja Sotomayor 9
xsl:apply-templates (VII)! Cual se aplica? Lo indico con el atributo mode de xsl:apply-templates. <xsl:apply-templates select= articulo mode= negrita /> Otras Instrucciones! Lo que hemos visto es lo básico de XSLT. Tiene muchas otras instrucciones que le dan mucha potencia y versatilidad:! Iteración! Estructuras condicionales! Ordenación de nodos según un criterio 2002 Borja Sotomayor 10