Integración de medios digitales XML y XSLT Documentos estructurados y publicación electrónica. Manuel Agustí, Félix Buendía, Jose V. Benlloch y Vicente Atienza Curso 2008/2009 1 1 Presentación y objetivos Como se ha visto en clase de teoría, un documento XML es la definición de la estructura de un documento. Sobre este es posible aplicar transformaciones, como se indica en la web1, para obtener otros tipos de documentos a partir del original, por ejemplo a partir de XML se puede obtener una versión en texto ASCII, en otro vocabulario de XML (SVG, RSS,...), HTML, TXT o PDF. Fig, 1 Diagrama que representa la relación entre el tema de esta práctica y el papel las herramientas utilizadas. Puede consultar más detalles sobre Cocoon en “[Beta Cocoon: el entorno abierto de publicacion]”1. En su espacio de PoliformaT,. de la tarea relativa a esta práctica sobre de XML, guarde sólo los ficheros se le pidan como respuesta a la actividad final. La publicación se realizar sobre el servidor web-sisop atendiendo a las explicaciones dadas en clase así como en los mensajes enviados al grupo de teleenseñanza. En el laboratorio se propone realizar la práctica en plataforma GNU/Linux, donde ya existe una versión de Java instalada para nuestras necesidades en esta práctica y para este operativo. Sólo es necesario que se descomprima el contenido del enlace adjunto “Ficheros necesarios para la práctica de XML” en su directorio de trabajo. Esto le dará acceso a dos órdenes, xerces.sh y xalan.sh, que le ahorrarán trabajo a la hora de teclear. También se puede realizar sobre MS/Windows, en cuyo caso se habrá de ejecutar las órdenes xerces.bat y xalan.bat. Notas para la utilización fuera del laboratorio: Debe tener instalados un entorno de ejecución de Java y las librerías Xerces y Xalan para este. Puede instalarlas sobre entorno GNU/Linux seleccionándolas desde su programa de instalación de aplicaciones, aunque bastará que se descargue el enlace2 “Ficheros necesarios para la práctica de XML” si ya dispone de una máquina virtual Java.. La versión de Java deberá ser igual o superior a la 1.1. Para averiguarlo, desde un terminal, dependiendo del operativo sobre el que vaya a trabajar, ejecute $ java -version (en GNU/Linux) c:\>java -version (en MS/Windows) ó dependiendo de si está trabajando en una u otra plataforma. Es necesario verificar que se dispone de un entorno Java (e instalarlo, en su defecto), sólo si se realiza la práctica fuera del Laboratorio. Se puede utilizar, por ejemplo, el que puede descargar para su Consultar la URL<http://web-sisop.disca.upv.es/~smm/publicacions/articulCocoon/pagehtml.xml>. 2 Los enlaces a que se refiere este texto están en la página web de las prácticas de la asignatura, junto a aquel de donde se ha obtenido este documento. 1 2 plataforma de trabajo en el enlace “Si no tienes java instalado, puedes (JRE 2) bajártelo en el sitio web de SUN”. Para entorno GNU/Linux habrá de comprobar qué versión de Java dispone, como se ha indicado anteriormente e instalar las librerías de Xerces y Xalan indicadas. Para entorno Mac OSX no disponemos de un entorno específico y se sugiere utilizar el mismo material que para GNU/Linux. 1.1 ¿ Qué es XML ? XML (eXtensible Markup Language) es un lenguaje de marcado extensible que describe una clase de objetos de datos llamados documentos XML y, parcialmente, el comportamiento de los programas que los procesan. XML es un metalenguaje que permite diseñar un lenguaje propio de etiquetas para múltiples clases de documentos. La estructura de un documento XML se basa en la declaración de tipos de documentos (DTD) o en la definición de XML Schemas. La DTD (Document Type Declaration) proporciona la gramática para una clase de documentos XML. Esta gramática contiene la definición del conjunto de etiquetas que puede contener esa clase de documentos XML. Fig, 2 Esbozo de los principales elementos de la estructura del documento que recogerá la propuesta de trabajo de la asignatura. 2 Edición de XML La primera tarea consistirá en editar un ejemplo de documento XML. Dicho documento contendrá información relativa a la realización de un posible trabajo en la asignatura como el título, componentes del grupo y resumen. De manera gráfica, la relación entre estas informaciones que contendrá el documento que vamos a crear sigue la estructura indicada en la fig. 2. Los documentos XML deben empezar con una línea que describe la versión de XML y el tipo de codificación del documento. Aquí utilizaremos el conjunto de caracteres ISO-8859-1 porque es el que 3 incluye los caracteres propios del alfabeto español; facilitando así, entre otras cosas, la utilización de caracteres acentuados. <?xml version="1.0" encoding="ISO-8859-1"?> El resto de información del documento XML se estructura mediante un jerarquía de elementos delimitados por etiquetas. En primer lugar, se halla el elemento raíz, del que los demás elementos forman parte. A continuación se incluye un ejemplo de documento XML para representar la anterior estructura (lo llamaremos trabajoV1.xml y está dentro del fichero que se puede descargar en el enlace “Ficheros necesarios para la práctica de XML”): <?xml version="1.0" encoding="ISO-8859-1"?> <Trabajo> <Titulo> Práctica de XML </Titulo> <Grupo> <Componente> <Nombre>Manuel Agustí</Nombre> </Componente> <Componente> <Nombre>Vicente Atienza</Nombre> </Componente> <Componente> <Nombre>J.V. Benlloch</Nombre> </Componente> <Componente> <Nombre>Félix Buendía</Nombre> </Componente> </Grupo> <Resumen> <Parrafo>El trabajo consiste en explicar un lenguaje como XML</Parrafo> <Parrafo>Para ello, se describirá la edición de documentos XML</Parrafo> <Parrafo>A continuación se comprobará la validez de dichos documentos</Parrafo> <Parrafo>También se verán las opciones para procesar documentos XML</Parrafo> </Resumen> </Trabajo> Extraiga el fichero trabajoV1.xml del fichero comprimido al directorio de trabajo y utilice un editor de texto para visualizarlo. En este caso, el elemento raíz está representado por la etiqueta <Trabajo>. El resto de elementos representan información relativa al título, a los componentes del grupo y a los párrafos del resumen El elemento Titulo contiene una cadena de caracteres Los elementos Grupo y Resumen constan de otro nivel de elementos (Componente y Parrafo, respectivamente) que a su vez contienen cadenas de caracteres. Ejercicio 1: Con cualquier editor de texto cree un fichero ejercicioXML1.xml que contenga datos como el título del trabajo, del nombre de los componentes del grupo y un breve resumen del tema sobre el versa el mismo. 3 Comprobaciones sobre un documento XML El siguiente paso consistirá en analizar el documento XML, primero para comprobar si el documento está "bien formado" (well-formed), es decir, cumple las especificaciones de XML. Para ello se utilizará un analizador o parser. Si lo es, entonces se puede comprobar la validez del documento, esto es, si cumple con las reglas de definición de una gramática. Es decir, el documento se puede considerar que está construido acorde con un vocabulario o instanciación de un tipo de documento. 3.1 Análisis sintáctico (parsing) Para realizar esta tarea se utilizará Xerces, un programa realizado en Java, de modo que puede ser utilizado en cualquier plataforma y, además, coincide con la estrategia de publicación que se utiliza en el servidor. Comentar que, como otros programas se le pueden pasar parámetros. Así que utilizaremos un terminal para escribir la orden correspondiente a la tarea que necesitemos realizar. Para que realice su tarea sobre el contenido de un fichero de nombre fitxer.xml, se puede invocar como muestran los siguientes ejemplos de uso de este script: 4 Tarea Verificar si un fichero está bien formado Orden a ejecutar $ xerces.sh -V fitxer.xml $ xerces.sh fitxer.xml Verificar si un fichero está bien formado y codificar la salida en $ xerces.sh -e ISO-8859-1 fitxer.xml ISO-Latin-1 (por defecto se utiliza UTF-8) Ejercicio 2: Este ejercicio consiste en indicar el resultado del análisis sintáctico para el siguiente ejemplo de documento XML, que llamaremos trabajoV2.xml: <?xml version="1.0" encoding="ISO-8859-1"?> <Trabajo> <Titulo/> <Introduccion> <Resumen> <Parrafo>El trabajo consiste en ...</Parrafo </Resumen> </Introduccion> <Grupo> <Componente> <Nombre>Felix Buendía</Nombre> </Componente> </Grupo> </Trabajo> Descubra el tipo de error que se ha producido y cómo se resolverá. También se puede aplicar al ejemplo de fichero introducido en el ejercicio anterior. Compruebe qué sucede en aquel caso. 3.2 Validación Ahora comprobaremos si el documento es válido según la "declaración de tipo de documento" (DTD) que, en su caso, tenga asignado. La validación del documento XML se basa en la DTD. La siguiente línea representa un ejemplo de declaración que se puede añadir al principio del documento, a continuación de la versión de XML y el tipo de codificación. <!DOCTYPE Trabajo SYSTEM "trabajo.dtd"> Dicha declaración aunque no es obligatoria, para que el documento sea conforme a las reglas de XML, sí que define cómo encontrar la información del DTD, en este caso indicando que está en nuestro propio ordenador (SYSTEM) y tiene el contenido siguiente: <!ELEMENT Trabajo (Titulo, Grupo, PalabrasClave?, Introduccion, Desarrollo?, Archivos?)> <!ELEMENT Titulo (#PCDATA)> <!ELEMENT Grupo (Componente+)> <!ELEMENT Componente (Nombre, Datos?, foto?)> <!ELEMENT Nombre (#PCDATA)> <!ELEMENT Datos EMPTY> <!ATTLIST Datos Asignatura CDATA #REQUIRED Titulacion (Inf | Doc) #IMPLIED Correo CDATA #IMPLIED > <!ELEMENT foto EMPTY> <!ATTLIST foto fichero CDATA #REQUIRED ancho CDATA #REQUIRED alto CDATA #REQUIRED > 5 <!ELEMENT PalabrasClave (Item+)> <!ELEMENT Introduccion (Objetivos?, Resumen, Requerimientos?, Bibliografia?)> <!ELEMENT Objetivos (Frase+)> <!ELEMENT Resumen (Parrafo+)> <!ELEMENT Requerimientos (Parrafo+)> <!ELEMENT Bibliografia (Item*)> <!ELEMENT Desarrollo (Capitulo+)> <!ELEMENT Capitulo (#PCDATA)> <!ATTLIST Capitulo Titulo CDATA #REQUIRED Enlace CDATA #IMPLIED > <!ELEMENT Archivos (Enlace*)> <!ELEMENT Item (#PCDATA)> <!ELEMENT Parrafo (#PCDATA)> <!ELEMENT Frase (#PCDATA)> <!ELEMENT Enlace (#PCDATA)> <!ATTLIST Enlace Descripcion CDATA #IMPLIED > Para comprobar la validez del documento XML contra esta DTD, en este caso, se deberá: • Guardar la DTD en un fichero en el directorio de trabajo de forma que pueda ser accedido, puede descargarlo de los enlaces relativos a la práctica. • Editar el fichero XML para para que contenga la referencia (DOCTYPE) al tipo de documento. La validación se puede realizar mediante el mismo programa xerces, para ello se empleará una orden del estilo de $ xerces.sh -v fitxer.xml Ejercicio 3: Validar los documentos trabajoV1.xml y trabajoV2.xml Anote el error (o errores) encontrado y cómo se solucionarán. Mientras el documento XML no sea validado, no podrá someterse a la siguiente fase de transformación. Así que antes de pasar al siguiente punto deberá resolver esta situación. 4 Procesamiento de XML El siguiente paso consiste en procesar el documento XML introducido, con el fin de obtener diferentes representaciones de la información en formatos como HTML, TXT, ... Para ello se utilizarán "scripts" XSL, es decir, programas que utilizan como datos de entrada documentos XML y obtienen como salida el formato elegido. Veamos un ejemplo de código XSL, que llamaremos en adelante trabajo.xsl, para convertir a HTML de forma secuencial: <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink"> <xsl:output doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system=”http://www.w3.org/TR/html4/strict.dtd" method="html" encoding="iso-8859-1" omit-xml-declaration="yes" indent="yes"/> <xsl:template match="Trabajo"> <html> <head> <title><xsl:value-of select="Titulo"/></title> </head> 6 <body> <h1> <xsl:value-of select="Titulo"/> </h1> <xsl:for-each select="Introduccion/Resumen/Parrafo"> <p> <xsl:value-of select="."/> </p> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> Para aplicarlo al documento, se proporciona un fichero xalan.sh que permite ejecutar la herramienta encargada de la transformación Un ejemplo de su uso consiste en indicarle sobre qué fichero XML debe aplicar qué XSL, para obterner un determinado resultado (HTML, TXT, XML, ...): $ xalan.sh trabajoV2.xml trabajo.xsl trabajo.html Que aplica la hoja de transformaciones trabajo.xsl al documento trabajoV2.xml, para generar un resultado en trabajo.html. En caso de utilizar otros nombres de fichero recuerde que la secuencia debe ser la indicada. La ejecución de la herramienta se divide en dos fases: la primera donde se efectúa el análisis sintáctico del documento ("parsing") y la segunda, que trata de aplicar una transformación a dicho documento. Dicha herramienta consiste en un programa Java que utiliza una librería llamada Xalan. Una de sus ventajas es que está disponible en entornos GNU/Linux y MS/Windows. Otra es que es la misma que utilizará el método de publicación dinámico que abordamos en el punto siguiente. Ejercicio 4: Utilizando esta hoja de transformaciones, identifique las diferentes “instrucciones” del lenguaje XSLT. Identifique el código (o instrucciones XSL) encargado de visualizar el elemento Resumen del trabajo y razone por qué no aparecen los nombres de los integrantes del grupo aunque estén presentes en el archivo XML. 5 Publicación de XML Además del proceso de transformación descrito en el apartado “Procesamiento de XML” se puede utilizar una herramienta para aplicar dicha transformación cuando se accede al documento XML mediante un navegador web. Dicha herramienta se denomina Cocoon y sirve para publicar documentos XML en un entorno web. Cocoon funciona dentro del servidor de web Apache en forma de aplicación Java (servlet).. Su utilización es sencilla y se basa en guardar los documentos XML, DTD y XSL en el directorio public_html de la cuenta personal en el servidor de la asignatura e incluir las instrucciones pertinentes. Se pueden utilizar los ficheros XML, XSL que se han descrito en los anteriores apartados e incluir, en el fichero XML el siguiente código, inmediatamente tras la declaración del tipo de documento: <?xml-stylesheet type="text/xsl" href="trabajo.xsl"?> <?cocoon-process type="xslt"?> Se puede comprobar el funcionamiento de Cocoon si se dispone de un fichero trabajo.xml desde un navegador web como Mozilla/Firefox (por ejemplo) contra el servidor web de la asignatura, por ejemplo utilizando una dirección (URL) del estilo de: http://web-sisop.disca.upv.es/~<cuenta_usuario>/trabajo.xml Cuando se haya cargado la página, se puede observar el código HTML recibido que visualiza el navegador (con la opción de menú Ver | Código fuente) es el mismo que el obtenido en la fase de procesamiento con Xalan. 7 Ejercicio5: Incluya las anteriores instrucciones de procesado junto a la información de palabras clave (la etiqueta PalabrasClave) y publique el documento de nombre trabajo.xml directamente en el directorio public_html reseñado en los párrafos anteriores. Anote, en ejercicio5.txt íntegramente el código de el fichero XML y el código fuente del documento que está viendo en el navegador. Describa qué ha ocurrido: ¿por qué no son lo mismo?. Actividades propuestas El alumno deberá realizarlas a partir de sus propios conocimientos y contando con las aclaraciones necesarias del profesor sobre el enunciado. El objetivo de estas actividades es adquirir experiencia en poner en práctica los conocimientos sobre XSL e incorporar nuevos elementos del lenguaje XSLT mediante autoaprendizaje. Se entregará en PoliformaT, en la tarea asignada a esta práctica, todos los ficheros (en un TGZ: por ejemplo actividad1.tgz) necesarios para su resolución, Actividad 1 A partir de lo estudiado en este boletín, genere una variación de la DTD (que se llame trabajo2.dtd) inicial para que: ● Sea obligatorio utilizar las PalabrasClave en el documento XML ● Sea posible incluir en los Capitulo al menos un Parrafo. ● Que los Parrafo sean cero o más ocurrencias de Frase, foto y Enlace en cualquier número y en cualquier orden. Pista: buscar la posibilidad de utilizar el caracter “|“ dentro de una DTD. Actividad 2 Utilizando los ejemplos del "Anexo: Introducción a XSLT", amplíe los contenidos del XML y/o del XSL para que se muestre, en HTML 4.01 (Strict): • El efecto de la DTD realizada anteriormente (en la actividad 1). • La información relativa al: • Titulo. • Resumen. • Datos del autor, o de los autores, incluyendo un enlace al correo electrónico y una imagen asociada al mismo, en la que el atributo alt de la conversión contenga sólo el nombre de pila del autor.. • Las PalabrasClave para poner, en la presentación final, comas entre los diferentes ítems de las mismas, excepto en el final que deber estar acompañado de un punto. • La Bibliografia. Los contenidos del XML habrán de ser las realizaciones de las tres prácticas realizadas en la asignatura: esta y las dos anteriores sobre Revolution. Como resultado de esta actividad se habrá de entregar el fichero XML (trabajo2.xml), la XSL (trabajo2.xsl) y todos los ficheros necesarios para que se pueda reproducir el resultado. Pistas: busque la utilidad de las funciones position, last, y substring-before de XSL 8 Actividad 3 Genere una XSL (de nombre trabajo3.xsl) para obtener un listado, de texto plano, de todos los archivos externos referenciados en el documento XML creado. Cada uno en una línea y exceptuando las URL o referencias a archivos no locales. Bibliografía Al respecto de HTML: • Dave Raggett, “Getting started with HTML” <http://www.w3.org/MarkUp/Guide/>. • W3C, “The global structure of an HTML document“ (HTML 4.01 Specification), <http://www.w3.org/TR/REC-html40/struct/global.html> • Liam Quinn (The Web Design Group), “Choosing a DOCTYPE” <http://htmlhelp.com/tools/validator/doctype.html> Concerniente a CSS: • Dave Raggett, “Adding a touch of style” <http://www.w3.org/MarkUp/Guide/Style> A continuación se indican algunos enlaces de interés: • P. Grosso y N. Walsh, “XSL Concepts and Practical Use”, Arbortext, <http://www.arbortext.com/xsl/tutorial/tutorial.html> • XML en España<http://www.it.uc3m.es/~xml/> • J. Merelo, Transformando documentos XML usando XSLT <http://geneura.ugr.es/~jmerelo/ XSLT/XSLT-2001-1ed.htm> y Generación de páginas Web usando XSLT y XML <http://geneurael.ugr.es/~jmerelo/XSLT/>. Gupo GeNeura • Catálogo de herramientas XML <http://www.garshol.priv.no/download/xmltools/cat_ix.html> • Proyecto Apache (incluye Cocoon y Xalan) <http://xml.apache.org/> • About XML <http://www.ibiblio.org/xml/> • Editor XML<http://www.xmlmind.com/xmleditor/> • A. Reino, Introducción a XML en castellano, <http://www.areino.com/alf/docs/introxml.pdf> • EDI y XML <http://xml.org/feature_articles/2000_1107_miller.shtml> • Miloslav Nic (traducción de Iván García), “DTD Tutorial”, <http://www.zvon.org/xxl/DTDTutorial/General_spa/book.html>. Más información al respecto de estas tecnologías en <http://www.disca.upv.es/magustim/xml/ xmlInformacio.html> • 9 Anexo: introducción a XSLT Este anexo es una somera descripción de algunos elementos que pueden aparecer en una hoja de transformaciones de una forma práctica. Utilizaremos este mecanismo para transformar un documento XML y dotarle de un formato de presentación en HTML. XSL (eXtensible Stylesheet Language), es un lenguaje o vocabulario de XML para transformar documentos XML, es decir, se utiliza para dar formato (presentación) a un documento. Para ello, a diferencia de CSS, permite crear una salida que sea el resultado de seleccionar sobre qué parte del documento de partida se trabaja, componerlo con parte o la totalidad de otros, ... y describir su formato (su presentación) si es la intención del autor. XSL está compuesto de tres partes: • XSLT (XSL Transformations): La definición de un vocabulario que permite la aplicación de las modificaciones sobre el documento (o los documentos) de partida. Esto es las reglas que van a implementar la transformación a aplicar. • XPath (XML Path Language): La definición de las expresiones que permiten indicar los puntos a los que se refieren las acciones. • XSL-FO (XSL Formatting Objects): vocabulario especializado en la descripción de los elementos de presentación quese utilizan en la edición sobre formato papel. Las transformaciones que se describen con XSL son una secuencia de instrucciones, como el código fuente de un programa, pero bajo la sintaxis de XML. Se basan en la utilización de tres elementos constructivos. • Las variables y parámetros del proceso, como en otros lenguajes de programación. • Los selectores o expresiones que permiten obtener el contenido de un nodo, el de uno de sus atributos o especificar un conjunto de los primeros. • Los patrones o reglas de selección de los elementos del árbol XML que se está procesando, Para facilitar la diferenciación entre código XSL, propiamente dicho, del resto del documento, en las XSLs que utilizaremos antepondremos siempre el prefijo xsl: a las etiquetas de este vocabulario. Esto se conoce como especificación del espacio de nombres y se utiliza para evitar conflictos con etiquetas que pudieran denominarse igual pero que sean parte del resultado de la transformación. Para lo que sigue asumiremos que se dispone de un documento XML, que llamaremos trabajoV3.xml, cuyo contenido es el siguiente: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Trabajo SYSTEM "trabajo.dtd"> <Trabajo> <Titulo>Titul d'impresió</Titulo> <Introduccion> <Resumen> <Parrafo>Párrafo número 1</Parrafo> <Parrafo>Este es el segundo</Parrafo> </Resumen> </Introduccion> <Grupo> <Componente> <Nombre>Nom </Nombre> <Datos Correo="[email protected]"/> <Foto Fichero="foto.jpg" Ancho="4" Alto="4"/> </Componente> </Grupo> </Trabajo> Ejercicio: Compruebe que está bien formado el documento anterior y guarde el resultado de ejecutar esta acción en un fichero bienFormado.txt. Valide el documento anterior, guarde el resultado de ejecutar esta acción en un fichero validar.txt. Si ha encontrado algún error resuélvalo ahora, antes de seguir adelante 10 1 Trabajando con XSL Estos documentos están compuestos de reglas, plantillas o templates, que indican cómo se procesa (transforma) un nodo de un documento XML. Estas pueden describen la transformación a aplicar de manera detalla. Una transformación XSL puede añadir nuevos elementos como resultado de su aplicación sobre un documento XML de partida o eliminar elementos, puede también reordenar los elementos, realizar comprobaciones y tomar decisiones acerca de qué elementos mostrar, etc. Por ejemplo, podemos obtener una versión en texto ASCII de nuestro documento de partida con una hoja de transformaciones como: <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" indent="yes" encoding="ISO-8859-1"/> <xsl:template match="/"> ¡Hola, mundo! áéíóú àèìòù </xsl:template> </xsl:stylesheet> Nota: El elemento raíz que declara que un documento es un hoja de transformaciones XSL es <xsl:stylesheet> ó <xsl:transform>. Ambos elementos pueden ser utilizados indistintamente. Observe que es un fichero XML, que está organizado alrededor de un elemento raiz stylesheet. En un segundo nivel, hay dos elementos: output y template. El primero sirve para indicar las características propias del documento que se va a generar como resultado de aplicar estta transformación. El segundo es el punto de entrada o de inicio de todo el código que realiza la transformación. Este segundo elemento tiene un atributo match que indica sobre qué elemento del documento XML original se aplica. En este caso la especificación del la raiz del documento ("/") representa a la totalidad del documento. Si el fichero que guarda esta transformación se llama xsl1.xsl, la podemos aplicar sobre el documento con una órden como: $ xalan.sh trabajoV3.xml xsl1.xsl resultado1Anexo.txt Con lo que se obtiene una transformación estática, es decir, independiente del contenido del documento de partida. El resultado que se obtiene es de la forma: ¡Hola, mundo! áéíóú àèìòù 2 Un primer documento HTML Para que sea dinámica, deberá ir obteniendo la salida a partir del contenido del documento en cuestión. Para ello debe ir extrayendo el contenido del documento y acceder al contenido de los elementos del documento XML, por ejemplo combinando el uso de la plantilla con el acceso a los elementos: <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system=”http://www.w3.org/TR/html4/strict.dtd" /> <xsl:template match="/"> <html> <head> <title><xsl:value-of select="Trabajo/Titulo"/></title> </head> 11 <body> <h1><xsl:value-of select="Trabajo/Titulo"/></h1> <p><xsl:value-of select="Trabajo/Introduccion/Resumen/Parrafo”/></p> </body> </html> </xsl:template> </xsl:stylesheet> que aplicaremos sobre el documento con una órden como:r $ xalan.sh trabajoV3.xml xsl2.xsl resultado2Anexo.html Como el caso anterior se propome la identificación del tipo de documento a generar (output) y una secuencia de instrucciones de transformación dentro de la única plantilla (template). A diferencia del caso del apartado anterior, lo que se genera es texto, pero para construir un documento HTML, así que hay que ir generando las etiquetas propias de este vocabulario de SGML e ir asignando el contenido de estas etiquetas con las selecciones del documento XML que se realizan con value-of. Obsérvese cómo se utilizan especificaciones de qué elementos están involucrados con las expresiones Xpath: como si fuesen rutas del sistema de archivos de un sistema operativo, se especifican de forma absoluta o relativa al punto del árbol XML al que se aplica una plantilla. 3 Un segundo documento HTML Para que el proceso se extienda a otros elementos del documento hay que extender estas secuencias de definición de plantillas (reglas o patrones) junto a las instrucciones que engloban. Veamos nuevos elementos que se pueden añadir a la transformación anterior y que comentamos en el propio código: <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system=”http://www.w3.org/TR/html4/strict.dtd" /> <xsl:template match="/"> <html> <head> <title><xsl:value-of select="Titulo"/></title> </head> <body> <!-- Para indicar que en este punto se han de lanzar otras plantillas --> <xsl:apply-templates /> </body> </html> </xsl:template> <!-Una plantilla que se aplicará al aparecer un elemento de etiqueta Titulo en el documento de partida. --> <xsl:template match="Titulo"> <!-- Para seleccionar el contenido del elemento actual del documento de partida: . --> <h1><xsl:value-of select="."/></h1> </xsl:template> <!-- Esta plantillal se aplicará al aparecer un elemento con etiqueta Grupo o Componente indistintamente. En cualquiera de los dos casos se limitará a continuar el examen del documento XML --> <xsl:template match="Grupo | Componente"> <xsl:apply-templates /> </xsl:template> <xsl:template match="Nombre"> <p class="nom"> 12 Jo soc:<xsl:value-of select="."/>. </p> </xsl:template> <xsl:template match="Datos"> <!-Especificar una acción condicionada a la evaluación de una expresión. La expresión en este caso permite acceder al contenido del atributo Correo del actual elemento considerado (con la @), el que ha lanzado la ejecución de esta plantilla: Datos. --> <xsl:if test="@Correo"> <p class="datos"> Escríbeme al <!-- Para concaternar una cadena de texto y la evaluación de una expresión: {} --> <a href="mailto:{@Correo}"> <xsl:value-of select="@Correo"/> </a>. </p> </xsl:if > </xsl:template> <!-Esta plantillal se aplicará al aparecer un elemento con etiqueta Foto o Introducción indistintamente. En cualquiera de los dos caso no se realiza nada con con sus contenidos. Así que se utilizará para descartarlos en el resultado. --> <xsl:template match="Foto | Introduccion"> </xsl:template> </xsl:stylesheet> Para aplicar esta nueva transformación se utilizará el mismo mecanismo que en casos anteriores: $ xalan-sh trabajoV3.xml xsl3.xsl resultado3Anexo.html 4 Otros elementos que pueden aparecer en una transformación XSLT Aunque este no es un listado, ni mucho menos exhaustivo, sirva como ejemplo de opciones o “instrucciones” disponibles en este lenguaje: • for-each. Para realizar un proceso de manera repetida sobre los elementos que cumplan la expresión que se indica en el atributo select de este elemento. Así para que el resumen sea capaz de mostrar todos los párrafos que se dispongan: <xsl:template match="Introduccion/Resumen"> <xsl:for-each select="Parrafo"> <p><xsl:value-of select=”.”/></p> </xsl:for-each> </xsl:template> • Las expresiones (que aparecen en el atributo match de las plantillas, test de las condicionales o en el select de otras instrucciones pueden especificar un elemento en base a su orden jerárquico y además a los que cumplan que tienen un atributo con un cierto valor. Por ejemplo, para no aplicar la plantilla anterior de Datos si el atributo Asignatura no tiene el valor “IMD”: <xsl:template match="Datos[@Asignatura = 'IMD']"> <!-- No hay cambios en el código interno de esta plantilla respecto al ejemplo anterior--> </xsl:template Otros operadores que se pueden utilizar son, por citar algunos, = (igual a), != (distinto de), &lt; (menor que) ó &gt; (mayor que), ... Obsérvese que se ha alternado el uso de las comillas (dobles “ y simples ') en las especificación de la selección para conseguir un código XSL sintácticamente correcto. • En ocasiones es necesario procesar los elementos del documento en relación a su orden dentro de la jerarquía de elementos del documento. Por ejemplo, se puede plantear escribir las palabras clave como términos separados por comas, excepto el último de los mismos que deber llevar un punto. Esto es posible con el uso de funciones como las de este ejemplo: <xsl:template match="PalabrasClave"> 13 <p> <xsl:for-each select="Item"> <xsl:value-of select="."/> <xsl:if test="position()=(last()-1)"> <xsl:text> i </xsl:text></xsl:if > <xsl:if test="position() &lt; (last()-1)"> <xsl:text>, </xsl:text> </xsl:if > <xsl:if test="position()=last()"> <xsl:text>.</xsl:text> </xsl:if > </xsl:for-each> </p> </xsl:template> • 14 Otros, que no se detallan ahora pero que pueden resultar de interés inmediato son sort, para ordenar por un criterio diferente al orden de aparición en el documento; y choose, para selección múltiple.