DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
Unidad 4: Transformación y adaptación de documentos XML.
XSL (Extensible Stylesheet Language, lenguaje de hojas de estilo extensible) es un lenguaje
XML para expresar hojas de estilo (cómo debe representarse un lenguaje XML concreto).
Consiste en tres componentes principales: XSLT (XSL transformations), XPath y XSL-FO
(XSL-formatting objects).
El lenguaje de estilos de XML, XSL, consiste en tres componentes principales:
• XSLT, un lenguaje de transformación de documentos.
• XPath, un lenguaje para referenciar a partes de documentos XML.
• XSL-FO, un lenguaje de formato de documentos XML.
XSLT: eXtensible Stylesheet Language for Transformations. Permite definir cómo se
transforma un documento XML en otro documento XML. Además de XML, se puede
generar como salida HTML y texto.
XSL-FO: eXtensible Stylesheet Language – Formatting Objects. Conversión del XML en un
formato “imprimible” y legible por una persona (ej.: PDF).
XPath: Una sintaxis para aludir a diversas partes de un documento XML.
XSL es un lenguaje estándar del W3C. Fue estandarizado en dos etapas:
la primera, en noviembre de 1999, incluía XSLT y XPath, mientras que la segunda,
completada en octubre del 2000, incluía el XSL-FO. XSLT es la parte del estándar XML que
sirve para transformar documentos XML en otros documentos XML (como por ejemplo
XHTML, WML (móviles), etc.).
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
XSLT normalmente 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 especificar o referenciara partes del
documento XML que cumplen uno o más patrones definidos.
Cuando encuentra una coincidencia de patrones, XSLT transformará la parte coincidente
del documento XML origen en el documento destino. Las partes no coincidentes no se
transforman, sino que quedan en el documento destino sin ningún cambio.
La hoja XSLT contiene básicamente dos tipos de elementos:
– Elementos de XSLT o XSL. Pertenecen al namespace xsl, y por tanto sus etiquetas llevan
el prefijo “xsl:” . Son el equivalente a las palabras clave del lenguaje de programación
(definidos por el estándar e interpretados por cualquier procesador de XSLT)
– Elementos LRE (Literal Result Elements). Son elementos que no pertenecen a XSLT, sino
que se repiten en la salida sin más (ejemplo: un elemento de un documento XML <fecha>)
Como casi todos los estándares del W3C, XSLT es en sí mismo un lenguaje XML y debe
empezar con un elemento raíz. Dicho elemento raíz es del tipo xsl: stylesheet. Un
documento XSLT o XSL tiene la siguiente cabecera:
<xsl:stylesheet version=“1.0”
xmlns:xsl=“[Link]
Esta declaración identifica el espacio de nombres recomendado por el W3C. Si usamos este
espacio de nombres, debemos incluir también el atributo versión con el valor 1.0.
Bajo la etiqueta <?xml...?> del fichero XML, se añade
<?xml-stylesheet type="text/xsl" href="[Link]"?> para relacionar el documento XML
con el documento XSLT o XSL.
Ejemplo de documento XSL para convertir un documento XML en otro XHTML es el
siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="[Link]
version="1.0">
<xsl:template match="/">
<html>
<body>
<h2>Expediente académico</h2>
<table style="border: 1px solid black;border-collapse: collapse;">
<tr style="background-color:#9acd32;">
<th style="text-align: left;"> Asignatura</th>
<th style="text-align: left;">Nota</th>
</tr>
<xsl:for-each select="expediente/asignatura">
<tr style="border: 1px solid black;">
<td style="border: 1px solid black;"><xsl:value-of select="nombre"/></td>
<td style="border: 1px solid black;"><xsl:value-of select="nota"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
El propio documento XSLT combina sentencias de transformación con código HTML.
Todas las etiquetas XSLT empiezan por xsl que es el namespace definido anteriormente.
Si llamamos al documento XSL “[Link]”, podemos vincularlo con nuestro XML
añadiendo una referencia a la hoja de estilo al principio del XML, del siguiente modo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="[Link]"?>
<expediente alumno=“Linus Torvalds”>
<asignatura id=“1”>
<nombre>
Programación básica
</nombre>
<nota>
Notable
</nota>
</asignatura>
<asignatura id=“2”>
<nombre>
Sistemas operativos
</nombre>
<nota>
Excelente
</nota>
</asignatura>
</expediente>
Si disponemos de un navegador con soporte XSL para abrir el documento XML, el
navegador utilizará el documento XSL para transformarlo en XHTML.
Soporte XSLT en los principales navegadores:
[Link]
Se puede utilizar como editor Sublime Text o XMLCopy Editor.
XMLCopy Editor.
Creamos un nuevo documento en este caso XSL
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
Escribimos el codigo XSL (XSLT)
Abrimos un nuevo fichero XML, escribimos el codigo XML
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
Asociamos a este documento XML el fichero XSL
Y se crea la línea 2, que relaciona mi documento XML con el XSL creado
Ejecutamos la transformación sobre el fichero XML
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
El documento obtenido lo guardamos como fichero HTML
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
Abrimos el fichero con un navegador y obtenemos la siguiente pantalla
[Link]
El elemento xsl: template
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 (también podemos aplicar la plantilla a todo el documento
XML, para lo cual podemos especificar match=“/”).
Los valores que podemos asignar al atributo match son los especificados por el estándar
XPath.
El elemento value-of
El elemento value-of se usa para seleccionar y añadir a la salida el valor del elemento XML
seleccionado. Veremos en el resultado que aparece la primera nota del expediente.
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
Esto se debe a que las etiquetas value-of seleccionan el valor del primer elemento que
cumple con el patrón especificado.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="[Link]
version="1.0">
<xsl:template match="/">
<html>
<body>
<h2>Expediente académico</h2>
<table style="border: 1px solid black;
border-collapse: collapse;">
<tr style="background-color:#9acd32;">
<th style="text-align: left;"> Asignatura</th>
<th style="text-align: left;">Nota</th>
</tr>
<tr>
<td style="border: 1px solid black;">
<xsl:value-of select="expediente/asignatura/nombre"/></td>
<td style="border: 1px solid black;">
<xsl:value-of select="expediente/asignatura/nota"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
El elemento xsl: for-each
El elemento xsl:for-each de XSL 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:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="[Link]
version="1.0">
<xsl:template match="/">
<html>
<body>
<h2>Expediente académico</h2>
<table style="border: 1px solid black;
border-collapse: collapse;">
<tr style="background-color:#9acd32;">
<th style="text-align: left;"> Asignatura</th>
<th style="text-align: left;">Nota</th>
</tr>
<xsl:for-each select="expediente/asignatura">
<tr>
<td style="border: 1px solid black;"><xsl:value-of select="nombre"/></td>
<td style="border: 1px solid black;"><xsl:value-of select="nota"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Obtendremos ahora un listado de todas las notas de las asignaturas.
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
Practica I.
Obtener la siguiente tabla:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="[Link]"?>
<libros>
<libro>
<titulo>Fuente Ovejuna</titulo>
<autor>Lope de Vega</autor>
<isbn>84-9815-002-7</isbn>
</libro>
<libro>
<titulo>La Celestina</titulo>
<autor>Fernando de Rojas</autor>
<isbn>84-96390-96-9</isbn>
</libro>
</libros>
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 documento XSL.
<xsl:sort select="expresion"
data-type="text|number"
order="ascending|descending"
case-order="upper-first|lower-first"/>
Attribute Value Description
XPath- Opcional. Especifica en qué nodo / conjunto de
select
expression nodos ordenar
Opcional. Especifica el tipo de datos de los datos
text
data-type que se ordenarán. El valor predeterminado es
number
"texto"
ascending Opcional. Especifica el orden de clasificación. El
order
descending valor predeterminado es "ascendente"
upper-first Opcional. Especifica si las letras mayúsculas o
case-order
lower-first minúsculas se deben ordenar primero.
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="[Link]
version="1.0">
<xsl:template match="/">
<html>
<body>
<h2>Expediente académico</h2>
<table style="border: 1px solid black;
border-collapse: collapse;">
<tr style="background-color:#9acd32;">
<th style="text-align: left;"> Asignatura</th>
<th style="text-align: left;">Nota</th>
</tr>
<xsl:for-each select="expediente/asignatura">
<xsl:sort select="nota"/>
<tr>
<td style="border: 1px solid black;"><xsl:value-of select="nombre"/></td>
<td style="border: 1px solid black;"><xsl:value-of select="nota"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
El atributo select nos permite indicar el elemento por el que vamos a realizar la
ordenación, en este caso por nota.
Condiciones en XSL
Disponemos de dos elementos XSL que nos permiten implementar condiciones en
nuestras transformaciones. Se trata de xsl:if y xsl:choose.
Elemento xsl:if
El elemento xsl:if nos permite ejecutar unas sentencias o una plantilla sólo en el caso de
que la condición especificada en el “if” se cumpla, es decir sea verdadero.
Operador Descripción
• and AND lógico
• or OR lógico
• not() Negación
• = Igualdad
• != No igual
• < Menor que (<)
• <= Menor o igual que (<=)
• > Mayor que (>)
• >= Mayor o igual que (>=)
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
Un ejemplo de formato de xsl:if es el siguiente:
<xsl:if test=“nota < 5”>
..... sólo aparecerán las notas menor a 5 ...
</xsl:if>
[Link]:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="[Link]"?>
<expediente alumno="Linus Torvalds">
<asignatura id="1">
<nombre>
Programación básica
</nombre>
<nota>
4
</nota>
</asignatura>
<asignatura id="2">
<nombre>
Sistemas operativos
</nombre>
<nota>
6
</nota>
</asignatura>
</expediente>
[Link]:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="[Link]
version="1.0">
<xsl:template match="/">
<html>
<body>
<h2>Expediente académico</h2>
<table style="border: 1px solid black;
border-collapse: collapse;">
<tr style="background-color:#9acd32;">
<th style="text-align: left;"> Asignatura</th>
<th style="text-align: left;">Nota</th>
</tr>
<xsl:for-each select="expediente/asignatura">
<xsl:if test="nota < 5">
<tr>
<td style="border: 1px solid black;"><xsl:value-of select="nombre"/></td>
<td style="border: 1px solid black;"><xsl:value-of select="nota"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
El elemento xsl:choose
El elemento xsl:choose (junto con xsl:when y xsl:otherwise), nos permite crear tests
condicionales múltiples. Esto es, podemos, en función de una condición múltiple (con
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
Desarrollo de Aplicaciones Web
Módulo de LMSGI
Centro Integrado de Formación Profesional Unidad 4
AVILÉS
múltiples valores posibles), obtener resultados diversos. El elemento <xsl:choose> anida
los elementos <xsl:when> que contienen una evaluación/prueba escrita en XPath y el
respectivo contenido a ejecutarse, y además se puede incluir el elemento <xsl:otherwise>
para ejecutarse en caso de no cumplirse ninguna evaluación definida en <xsl:when>.
Un ejemplo de formato de xsl:choose es el siguiente:
<xsl:choose>
<xsl:when test=“nota < 5”>
... código (suspendido) ....
</xsl:when>
<xsl:when test=“nota < 9”>
... código (normal) ....
</xsl:when>
<xsl:otherwise>
... código (excelente) ....
</xsl:otherwise>
</xsl:choose>
[Link]:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="[Link]
version="1.0">
<xsl:template match="/">
<html>
<body>
<h2>Expediente académico</h2>
<table style="border: 1px solid black;
border-collapse: collapse;">
<tr style="background-color:#9acd32;">
<th style="text-align: left;"> Asignatura</th>
<th style="text-align: left;">Nota</th>
</tr>
<xsl:for-each select="expediente/asignatura">
<tr>
<td style="border: 1px solid black;">
<xsl:value-of select="nombre"/></td>
<td style="border: 1px solid black;">
<xsl:choose>
<xsl:when test="nota < 5">
<span style="background-color: #FF0000">
<xsl:value-of select="nota"/>
</span>
</xsl:when>
<xsl:otherwise>
<span style="background-color: blue">
<xsl:value-of select="nota"/>
</span>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>