Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 7 En esta práctica veremos cómo aplicar transformaciones XSLT a documentos XML. Esta tecnología nos permite hacer algo similar a lo que ya hicimos en la práctica 6 con los recorridos de árboles de sintaxis abstracta de ANTLR: procesar información estructurada. A diferencia de los procesadores desarrollados con ANTLR, en el caso de XML se puede decir que nos expresamos directamente en términos de sintaxis abstracta. Esto hace que sólo sea necesario desarrollar las últimas etapas del procesador ya que los módulos léxico y sintáctico son resueltos mediante parsers genéricos XML. Ambas tecnologías (XSLT y ANTLR) tienen dominios de aplicación distintos, pero los conceptos en los que se apoyan son bastante parecidos al basarse fundamentalmente en el procesamiento de árboles (AST en el caso de ANTRL, y DOM en el caso de XML). Un ejemplo simple Para aplicar una transformación XSLT necesitamos dos fuentes: los datos de entrada en un fichero XML y las reglas de transformación en un fichero XSL. En este primer ejemplo trabajaremos con un listado de precipitaciones en distintos lugares y fechas (entrada.xml): <?xml version="1.0" ?> <precipitaciones> <registro> <lugar>Sevilla</lugar> <fecha>07/09/2007</fecha> <litros-m2>10</litros-m2> </registro> <registro> <lugar>Huelva</lugar> <fecha>07/09/2007</fecha> <litros-m2>20</litros-m2> </registro> <registro> <lugar>Cádiz</lugar> <fecha>07/09/2007</fecha> <litros-m2>15</litros-m2> </registro> <registro> <lugar>Almería</lugar> <fecha>17/10/2007</fecha> <litros-m2>5</litros-m2> </registro> <registro> <lugar>Granada</lugar> <fecha>18/10/2007</fecha> <litros-m2>25</litros-m2> </registro> <registro> <lugar>Sevilla</lugar> <fecha>21/12/2007</fecha> <litros-m2>36</litros-m2> </registro> <registro> <lugar>Huelva</lugar> <fecha>21/12/2007</fecha> <litros-m2>41</litros-m2> </registro> </precipitaciones> Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla Estos datos son procesados por unas reglas de transformación que generarán un fichero HTML que podrá ser visualizado con un navegador. Las reglas están escritas en XSL (transformacion.xsl): <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> <xsl:output method="html"/> <xsl:template match="/precipitaciones"> <html> <head> <title>Listado de precipitaciones</title> </head> <body> <h2>Registros de precipitaciones</h2> <ul> <xsl:apply-templates select="registro"> </xsl:apply-templates> </ul> </body> </html> </xsl:template> <xsl:template match="registro"> <li> <b><xsl:value-of select="lugar"/> <xsl:text>:</xsl:text></b> <xsl:value-of select="fecha"/> <xsl:text>(</xsl:text> <xsl:value-of select="litros-m2"/> <xsl:text> l/m2)</xsl:text> </li> </xsl:template> </xsl:stylesheet> El documento HTML generado presenta el siguiente aspecto al ser visualizado con un navegador: Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla Algunos elementos de XSLT En este apartado explicaremos los elementos utilizados en la transformación del ejemplo. • El elemento <xsl:stylesheet> es el elemento raíz de una transformación. Dentro de él se especifican varios atributos, entre ellos los espacios de nombres que se utilizarán en la especificación. En nuestro ejemplo se han definido dos espacios de nombres, xsl para las etiquetas del lenguaje XSL y otro sin nombre (por defecto) para las etiquetas HTML. • El elemento <xsl:output/> establece el formato del fichero de salida, en el ejemplo es "html". • Con el elemento <xsl:template> se definen las reglas de transformación. Al igual que las reglas gramaticales, estas reglas tienen una parte izquierda y una parte derecha. El atributo match recibe una expresión XPath que establece a qué elementos de la entrada debe aplicarse la transformación (la parte izquierda). La parte derecha de la regla es todo lo que queda contenido entre <xsl:template> y </xsl:template>. • El elemento <xsl:apply-templates> sirve para aplicar una regla al elemento actual o a alguno de sus hijos. Con el atributo select se puede especificar una expresión XPath para que procesar sólo aquellos elementos que encaje con ella. • El elemento <xsl:value-of/> extrae el contenido de un elemento. Mediante el atributo obligatorio select se establece con una expresión XPath cuál es el elemento. • El elemento <xsl:value-of select="lugar"/> es … • El elemento <xsl:text> sirve para generar texto “literal” en la salida. Se puede insertar texto en la salida sin hacer uso de este elemento, pero puede ser de ayuda para componer el formato (espacios y fines de línea) de la salida sin tener que forzar la estructura del código de la transformación. También permite dar un tratamiento especial a los caracteres de escape mediante el atributo disable-output-escaping. Más información en … XSLT es un lenguaje bastante complejo y esta práctica no pretende ser un tutorial completo. En el enunciado nos hemos limitado a explicar los elementos usados en el ejemplo y los necesarios para desarrollar los ejercicios propuestos. En los siguientes enlaces se puede encontrar una información más completa y detallada de esta tecnología: El W3C http://www.w3.org/ http://www.w3.org/Style/CSS-vs-XSL La wikipedia http://en.wikipedia.org/wiki/XML http://en.wikipedia.org/wiki/XPath http://en.wikipedia.org/wiki/XSL Cursos y apuntes http://www.bib.uc3m.es/~nogales/cursos/xslt.html http://www.utomde.com/asigna/sgbd/xml.pdf http://geneura.ugr.es/~jmerelo/XSLT/ http://www.w3schools.com/xsl/ http://www.topxml.com/xsl/tutorials/intro/default.asp Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla El plugin OrangeVolt para Eclipse Hay muchas alternativas para aplicar transformaciones XSLT, en esta práctica trabajaremos con el plugin OrangeVolt para Eclipse que permite editar y ejecutar este tipo de transformaciones de manera muy cómoda. Aquí explicaremos los pasos básicos para la instalación y ejecución del plugin, una descripción mucho más detallada se encuentra en el tutorial Getting started with the Orangevolt Eclipse XSLT plug-in. Los requisitos mínimos para el plugin son Eclipse IDE V3.3, Java 2 Platform Standard Edition V1.5 y Eclipse Web Tools Platform (WTP) V2.0.1. Pero lo más cómodo es instalar el Eclipse IDE for Java EE Developers que nos asegura ya estos requisitos. Los pasos básicos para instalar el plugin: 1. Descargar Eclipse-jee y descomprimirlo. 2. Seguir la secuencia Help → Software Updates … → Available Software → Add Site … 3. En ese punto el entorno solicitará la URL donde se encuentra el plugin. Se debe introducir la dirección http://eclipsexslt.sourceforge.net/update-site 4. Reiniciar eclipse. 5. Mediante la secuencia Window → Preferences seleccionar el procesador Default Transformer de OrangeVolt: Una vez instalado el plugin, los pasos para crear un proyecto y aplicar una transformación son: 1. Crear un nuevo proyecto de tipo General. 2. Crear los ficheros entrada.xml y transformacion.xsl dentro del proyecto. 3. Seguir la secuencia Run → Run Configurations … para crear y ejecutar una nueva configuración de ejecución OrangeVolt. En la siguiente captura de pantalla se muestran los datos que deben incluirse: Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla El navegador XPath de OrangeVolt El plugin OrangeVolt incluye un intérprete XPath que permite comprobar el conjunto de elementos que son accesibles mediante una expresión XPath. Para usarlo basta con seguir la siguiente ruta en el menú de Eclipse: Window →Show View →Other… →Orangevolt → XPathNavigator Y en la parte baja de la pantalla de Eclipse aparecerá la pestaña XPath Navigator que dará acceso a una ventana en la que tras especificar un fichero xml y una expresión XPath se muestran los elementos seleccionados por dicha expresión: Ejercicios 1. Instalar el plugin OrangeVolt. 2. Alpicar la transformación del enunciado al ejemplo de entrada propuesto y comprobar que se genera el fichero HTML correcto. 3. Comprobar el funcionamiento del navegador XPath con algunas expresiones XPath. Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla 4. Especificar una transformación que genere un documento XML a partir de la entrada del enunciado en el que sólo se muestren las precipitaciones de una ciudad determinada. Por ejemplo, para Sevilla la salida sería: <?xml version="1.0" encoding="UTF-8"?> <precipitaciones> <lugar>Sevilla</lugar> <registro> <fecha>07/09/2007</fecha> <litros-m2>10</litros-m2> </registro> <registro> <fecha>21/12/2007</fecha> <litros-m2>36</litros-m2> </registro> </precipitaciones> La ciudad se especificará en el propio fichero de la transformación mediante una variable con el elemento <xsl:variable>. También será necesario utilizar el elemento <xsl:if>. 5. Especificar una transformación que genere un documento XML a partir de la entrada del enunciado en el que sólo se muestren las precipitaciones que superen una cierta cantidad de litros por metro cuadrado, por ejemplo: <?xml version="1.0" encoding="UTF-8"?> <precipitaciones> <registro> <lugar>Huelva</lugar> <fecha>21/12/2007</fecha> <litros-m2>41</litros-m2> </registro> <registro> <lugar>Sevilla</lugar> <fecha>21/12/2007</fecha> <litros-m2>36</litros-m2> </registro> <registro> <lugar>Granada</lugar> <fecha>18/10/2007</fecha> <litros-m2>25</litros-m2> </registro> </precipitaciones> La cantidad se especificará en el propio fichero de la transformación mediante una variable. Para este ejercicio será necesario utilizar los elementos <xsl:foreach> y <xsl:sort>. 6. El lenguaje GraphML es una notación basada en XML para especificar grafos. El siguiente ejemplo muestra una pequeña red de carreteras expresadas en este lenguaje: <?xml version="1.0" encoding="UTF-8"?> <graphml> <graph> <node id="sevilla"/> <edge source="sevilla" target="huelva"/> <edge source="sevilla" target="cadiz"/> <edge source="sevilla" target="rosal de la frontera"/> <node id="cadiz"/> <edge source="cadiz" target="medina sidonia"/> <node id="huelva"/> <edge source="huelva" target="rosal de la frontera"/> <node id="medina sidonia"/> <node id="rosal de la frontera"/> </graph> Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla </graphml> Escribir una transformación que genere un documento XML en el que sólo estén presentes los arcos del grafo. Para resolver este ejercicio será de utilidad el elemento <xsl:copy-of>. La salida sería: <?xml version="1.0" encoding="UTF-8"?> <graphml> <graph> <edge source="sevilla" target="huelva"/> <edge source="sevilla" target="cadiz"/> <edge source="sevilla" target="rosal de la frontera"/> <edge source="cadiz" target="medina sidonia"/> <edge source="huelva" target="rosal de la frontera"/> </graph> </graphml> 7. Ampliar el ejercicio anterior para que sólo se muestren los arcos que tienen como atributo source una ciudad determinada. El nombre de la ciudad se especificará mediante una variable en el fichero de la transformación. Por ejemplo para “cadiz” la salida sería: <?xml version="1.0" encoding="UTF-8"?> <graphml> <graph> <edge source="cadiz" target="medina sidonia"/> </graph> </graphml> 8. Ampliar el ejercicio anterior de manera que se muestren los arcos que tienen como atributo source o como atributo target una ciudad determinada. Por ejemplo, para “cadiz” la salida sería: <?xml version="1.0" encoding="UTF-8"?> <graphml> <graph> <edge source="sevilla" target="cadiz"/> <edge source="cadiz" target="medina sidonia"/> </graph> </graphml>