¡Descarga Transformación de documentos XML y más Resúmenes en PDF de Programación Informática solo en Docsity!
TRANSFORMACIÓN DE DOCUMENTOS XML
- Unidad de Trabajo
- 1 CSS y XML ................................................................................................................................................................. Contenido
- 2 XSL ..............................................................................................................................................................................
- 2.1 XPath ..................................................................................................................................................................
- 2.2 XSL-T .................................................................................................................................................................
- Ejemplo de transformación XSL-T a XHTML....................................................................................................
- Ejemplo de transformación XSL-T a XML ..........................................................................................................
- Elementos y características de XSL-T.................................................................................................................
- 2.3 XSL-FO
- 3 Herramientas de procesamiento de XML
- 3.1 DOM................................................................................................................................................................
- 3.2 SAX
- Bibliografía
1 CSS y XML
Aunque las hojas de estilo CSS tradicionalmente se asocian con ficheros HTML, también se pueden utilizar
para transformar un fichero XML. En el siguiente ejemplo asociamos un fichero XML con un fichero CSS
externo mediante la instrucción :
The Cook, The Thief, His Wife and Her Lover Peter Greenaway 1989
Wonderland Michael Winterbottom 1999
The Navigators Ken Loach 2001
Este es el fichero CSS:
videos { font-family: Arial, sans-serif; font-size: 12px; }
dvd { display: block; border: thin solid black; margin: 10px; padding: 10px; }
nombre { font-family: Garamond, Times New Roman, serif; font-weight: bold; font-size: 16px; }
director { display: block; }
El funcionamiento normal de XSLT transforma cada elemento XML en otro elemento XML, pero también
puede añadir otros elementos XML a la salida, o bien puede eliminar elementos. Asimismo puede reordenar o
recolocar elementos y hacer comprobaciones y decisiones sobre qué elementos mostrar.
Durante la transformación, XSLT utiliza XPath para referenciar partes del documento que cumplen uno o
más patrones definidos. Cuando encuentra una coincidencia de patrones, XSLT transformará la parte
coincidente del documento origen en el documento destino. Las partes no coincidentes no se transforman.
2.1 XPath
XPath es un estándar del W3C que define un conjunto de reglas para referenciar partes de un documento
XML. No es un lenguaje de consulta, sino una herramienta que permite localizar elementos dentro de la
estructura jerárquica de un documento XML. Algunas de sus características son:
- Usa notación de rutas para definir elementos XML.
- Define una librería de funciones.
- Es un elemento básico de XSL.
- No está definido en XML.
Partiremos, como ejemplo, del siguiente fichero XML:
Programación básica Notable
Sistemas operativos Excelente
...
La siguiente expresión XPath selecciona el elemento raíz expediente:
/expediente
La siguiente selecciona todos los elementos asignatura del elemento expediente:
/expediente/asignatura
La siguiente selecciona todos los elementos nota de todos los elementos asignatura del elemento
expediente:
/expediente/asignatura/nota
La siguiente no utiliza una ruta absoluta, sino relativa (no se indica la barra de raíz). Selecciona el elemento
matricula, que debe ser hijo del elemento actual:
matricula
Todas estas expresiones se pueden referenciar desde documentos XSLT.
Seleccionar elementos desconocidos
Al igual que ocurre con los sistemas de ficheros, podemos utilizar caracteres comodín (*) para indicar
elementos desconocidos. La siguiente expresión selecciona todos los elementos hijos de todos los elementos
asignatura del elemento expediente:
/expediente/asignatura/*
La siguiente selecciona todos los elementos nombre nietos del elemento expediente independientemente de
cuál sea el elemento padre:
/expediente/*/nombre
En cambio esta selecciona los elementos nombre descendientes de expediente independientemente de cuál sea
su grado de relación (hijo, nieto, bisnieto…):
/expediente//nombre
La siguiente expresión selecciona todos los elementos del documento:
Seleccionar ramas del árbol
Podemos especificar qué partes del árbol de nodos queremos seleccionar usando corchetes ([ ]) en las
expresiones XPath. Podemos, por ejemplo, seleccionar el primer elemento asignatura del elemento
expediente:
/expediente/asignatura[1]
La siguiente expresión selecciona el último elemento asignatura hijo del elemento expediente:
/expediente/asignatura[last()]
La siguiente expresión selecciona todos los elementos asignatura hijos del elemento expediente que
contengan un elemento nota:
/expediente/asignatura[nota]
La siguiente obliga, además, a que el elemento nota tenga un valor determinado:
En contraposición a last(), no existe una función first(). En su lugar hay que usar el marcador 1.
2.2 XSL-T
Como casi todos los estándares del W3C, XSL-T (XSL Transform) es en sí mismo un lenguaje XML y debe
empezar con un elemento raíz. Dicho elemento raíz es del tipo xsl:stylesheet o xsl:transform (ambas
etiquetas son totalmente equivalentes). La forma correcta de uso es:
Esta declaración identifica el espacio de nombres recomendado por el W3C. Si usamos este espacio de
nombres, debemos incluir también el atributo version con el valor 1.0.
De acuerdo con los borradores del estándar, la declaración correcta de una hoja de estilo era:
Dicha declaración está obsoleta, pero es la requerida por el navegador IE-5.
A partir de documentos XML cuyo contenido referenciará mediante expresiones XPath, XSLT permite
generar otros documentos en formato XML, HTML, texto o RTF, entre otros. La transformación también
puede implicar una depuración o bien una reorganización de la información original.
Ejemplo de transformación XSL-T a XHTML
Vamos a transformar, como ejemplo, el siguiente fichero XML a XHTML:
Programacion basica Notable
Sistemas operativos Excelente
...
Este documento XML corresponde a un expediente de un estudiante de una universidad cualquiera. Se trata
de un documento muy simple, pero totalmente válido para nuestras necesidades. El documento XSL para
convertir este documento XML en otro XHTML es el siguiente:
Expediente académico
Expediente académico
Asignatura Nota
Los elementos select están utilizando sintaxis de XPath. Si llamamos al documento XSL expediente.xsl,
podemos vincularlo con nuestro documento XML añadiendo una referencia a la hoja de estilo al principio del
XML, del siguiente modo:
...
Si disponemos de un navegador con soporte XSL (como Mozilla en versiones superiores a la 1.2) para abrir el
documento XML, el navegador utilizará el documento XSL para transformarlo en XHTML, obteniendo la
salida siguiente:
Elementos y características de XSL-T
- La salida de XPath. xsl:output
El elemento xsl:output indica cuál es el formato de la salida de la transformación: un documento XML,
HTML o de texto (text).
El siguiente ejemplo transforma un documento XML en un documento HTML:
...
Una hoja de estilo de XSL consiste en una serie de plantillas (templates) de transformación. Cada elemento
xsl:template contiene las transformaciones que XSL debe aplicar si el patrón especificado en el elemento
coincide con lo encontrado en el documento XML. Para especificar el elemento XML al que debemos
aplicar el template utilizaremos el atributo match, cuyos posibles valores son expresiones XPath. Podemos
aplicar la plantilla a todo el documento XML, para lo cual podemos especificar match="/".
El elemento value-of se usa para seleccionar y añadir a la salida el valor del elemento XML seleccionado.
Por ejemplo, si añadimos el siguiente código a nuestro ejemplo anterior:
Expediente académico
Asignatura Nota
Veremos en el resultado que aparece la primera nota del expediente. Esto se debe a que las etiquetas
value-of seleccionan el valor del primer elemento que cumple con el patrón especificado.
El elemento xsl:for-each de XSL permite una lectura de valores en bucle. Puede utilizarse para
seleccionar cada uno de los elementos del documento XML que pertenezcan a un conjunto determinado.
Si al ejemplo anterior, donde sólo aparecía la primera nota del expediente, le añadimos un xsl:for-each
que realice el recorrido por todo el expediente de la siguiente forma:
Expediente Académico
Asignatura Nota
Obtendremos ahora un listado de todas las notas de las asignaturas.
- Ordenación de la información: xsl:sort
Para obtener una salida ordenada, simplemente debemos añadir un elemento xsl:sort al elemento
xsl:for-each en nuestro fichero XSL:
Expediente Académico
En este caso se ha decidido aplicar todas las plantillas de una vez. De haber utilizado el atributo select se
habría especificado con precisión qué plantilla utilizar.
La alternativa a apply-templates es recorrer el árbol del documento mediante instrucciones for-each y
value-of. En este caso el código se hace más largo e inmanejable, crece la indentación y se pierde
modularidad, conformándose un fichero XSL muy similar al documento de salida.
Disponemos de dos elementos XSL que nos permiten implementar condiciones en nuestras
transformaciones. Se trata de xsl:if y xsl:choose.
El elemento xsl:if nos permite aplicar una plantilla sólo en el caso de que la condición especificada se
cumpla (sea cierta). Para especificar las condiciones hemos de utilizar operadores de comparación (mayor,
menor, igual o distinto). El estándar XSL obliga a utilizar entidades de carácter en vez de los caracteres
mayor menor (es decir, > en vez de ">" y < en vez de "<"). Igual se representa como "=" y distinto
como "!=". Un ejemplo de formato de xsl:if es el siguiente:
Sólo aparecerán las notas menores que 5
Nótese que los comentarios en XSL deben ir encerrados en el elemento .
Podemos modificar el código anterior para que sólo muestre las notas sobre 5.
Expediente Académico
Expediente Académico
Asignatura Nota
El elemento xsl:choose (junto con xsl:when y xsl:otherwise), nos permite modelar tests condicionales
múltiples. Esto es, en función de una condición múltiple (con múltiples valores posibles) podemos
obtener resultados diversos. Un ejemplo de formato de xsl:choose es el siguiente:
código (suspendido)
código (normal)
código (excelente)
Modificamos el ejemplo anterior para que las notas inferiores a cinco aparezcan en color rojo.
.rojo {color: red} ...
...
- Creación de elementos y atributos
Después, gracias al uso de la herramienta FOP convertimos el fichero .fo a .pdf mediante la siguiente
sentencia de línea de comandos:
Fop gastrono.fo gastronopdf.pdf
3 Herramientas de procesamiento de XML
3.1 DOM
Como ya se comentó en la Unidad de Trabajo 4, DOM (Document Object Model – modelo de objetos de
documento) define la jerarquía de objetos de un documento HTML. Profundizando podemos definir DOM
como un interfaz de programación que proporciona un conjunto estándar de objetos para representar
documentos. DOM es independiente de plataformas y lenguajes de programación, y permite a otros
programas actualizar dinámicamente el contenido, estructura y estilo de sus documentos HTML y/o XML.
La especificación "DOM nivel 2" incluyó la manipulación de eventos en el navegador, la de parte del texto y
la interacción con CSS. "DOM nivel 3" añade la validación de documentos y el uso de DTD.
Mediante aplicaciones comerciales, algunas gratuitas, o bien programas creados a tal efecto, se puede procesar
cualquier documento basado en el estándar XML.
3.2 SAX
Obedece a las siglas Simple API –Application Programming Interface– for XML (interfaz de programación de
aplicaciones simple para XML). Originalmente se diseñó para el lenguaje Java, aunque actualmente es
aplicable a otros lenguajes de programación que interactúen con documentos XML. Los parser SAX
interpretan los documentos XML línea a línea (no los cargan completos, por lo que necesitan menos memoria
que DOM), comprueban que el documento esté bien formado y gestionan los espacios de nombres. Es más
rápido que DOM, pero también más difícil de manipular.