Práctica 7 - Departamento de Lenguajes y Sistemas Informáticos

Anuncio
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>
Descargar