Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Hojas de Estilo para XML
Hojas de Estilo para XML
¿Qué es?
Es el acrónimo de EXtensible Stylesheet Language
XML no tiene tags predefinidos, y por tanto el
significado de cada tag no se sabe interpretar.
XSL describe cómo se debe visualizar un documento
XML
CSS es a HTML como XSL a XML
Más que una hoja de estilos
XSL consta de tres partes:
XSLT → un lenguaje para transformar documentos
XML
XPath → un lenguaje para navegar en documentos
XML
XSL-FO → un lenguaje para formatear documentos
XML
XSL
XSLT
XSLT (Xtensible Stylesheet Language for Transformations)
está basado en xml
Está normalizado por el W3C, que ha publicado tres
versiones de este lenguaje:
noviembre de 1999: XSLT 1.0
enero de 2007: XSLT 2.0
junio de 2017: XSLT 3.0
Es un lenguaje de programación declarativo que permite
generar documentos en diferentes formatos de salida (xml,
html, pdf….)
Se llama declarativo porque consiste en la declaración de
una serie de reglas o plantillas transforman el documento
xml a la salida deseada.
XSLT
Las reglas se almacenan en un documento xml que
tiene extensión .xsl
Estas reglas junto con el documento xml se pasan a un
procesador XSLT que genera el documento
transformado.
Las hojas de estilo deben estar bien formadas.
El xmlSpy (programa para editar xml) no nos las
valida, pues no tienen asociado un DTD o esquema.
XSL-Templates (XSLT)
XSLT
No solo es para aplicar estilos.
Permite filtrar contenidos, ordenar datos …
Las hojas XSL son externas y son documentos XML
<?xml version=“1.0” encoding=“UTF-8”?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
…
<xsl:stylesheet/>
Para usarlas hay que vincularlas en el XML de los datos
<?xml-stylesheet type=“text/xsl” href=“estilos.xsl”?>
Aplicación de las transformaciones
No debemos confundir las transformaciones XSLT con
la presentación de documentos XML con CSS
Con XSLT, generaremos un documento HTML a partir
de un documento XML. Se tratará de dos documentos
“distintos”
Con CSS, el navegador recibe un documento XML que
formatea utilizando las reglas CSS para presentarlo en
pantalla de forma que sea más fácilmente legible, pero
es el mismo documento.
Estructura de una hoja de estilo
XSLT
Una hoja de estilo XSLT es un documento XML. Debe
estar bien formado.
Comienzan con una declaración XML: <?xml
version="1.0“ encoding=“utf-8” ?>
El elemento raíz de la hoja de estilo XSLT es stylesheet.
Este elemento contendrá a todos los demás, y debe ir
precedido por el alias xsl correspondiente al espacio de
nombres para hojas de estilo XSLT.
Estructura de una hoja de estilo
XSLT
<?xml version="1.0" encoding=“UTF-8”?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...................
</xsl:stylesheet>
Con una hoja de estilos como ésta aplicada, hará que se muestre el texto
(pero no los atributos) de todos los elementos del xml
Estructura de una hoja de estilo
XSLT
Entre las marcas de inicio y de fin del elemento raíz
xsl:stylesheet, se escribirán las reglas de
transformación que se llaman plantillas.
Cada regla se definirá mediante un elemento
xsl:template (una plantilla)
Se utiliza el atributo match para asociar una plantilla
con un elemento XML o con la raiz “/” para aplicarlo a
todo el documento XML.
La regla indica qué instancias de los elementos del
documento XML se van a transformar.
Elementos básicos
Dentro de la instrucción <xsl:stylesheet> se pueden
encontrar los llamados elementos de alto nivel y las
plantillas, como en el ejemplo siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/"> </xsl:template>
</xsl:stylesheet>
Elementos básicos
La instrucción <xsl:template> es una plantilla.
El atributo match indica sobre qué parte del
documento se va a actuar y contiene una expresión
XPath.
El contenido de la instrucción define la transformación a
aplicar
Todo lo que se incluya dentro (entre las etiquetas
<xsl:template match=“”> y </xsl:template> será lo que
sirva para generar la salida formateada
El atributo match contiene
elementos Xpath
(iguales que el path de los sistemas operativos)
Expression Description
titulo Selecciona todos los nodos de nombre
titulo
/ Selecciona el nodo raíz (todo el xml)
// Selecciona todos los nodos que cuelgan
del actual
. Selecciona el nodo actual
.. Selecciona el nodo padre
@ Selecciona los atributos
ejemplos
//book Selects all book elements no matter where they are in the
document
bookstore//book Selects all book elements that are descendant of the
bookstore element, no matter where they are under the
bookstore element
//@lang Selects all attributes that are named lang
El path también puede llevar “predicados” entre [ ]
El path también puede llevar expresiones con los
siguientes operadores
Operador Descrición Ejemplo
| Comprueba dos alternativas //book | //cd
+ suma 6+4
- resta 6-4
* Multiplicación 6*4
div División 8 div 4
= Igual price=9.80
!= Distinto price!=9.80
< Menor que price<9.80
<= Menor o igual que price<=9.80
> Mayor que price>9.80
>= Mayor o igual que price>=9.80
or O price=9.80 or price=9.70
and Y price>9.00 and price<9.90
mod Módulo(resto de una divisón) 5 mod 2
Transformaciones especiales
Si la hoja de transformaciones no contiene plantillas, el documento xml se envía
directamente a la salida, omitiéndose los valores de los atributos.
<xsl:template match="/">
<xsl:value-of select="catalog/cd/title"/>
<xsl:value-of select="catalog/cd/artist"/>
</xsl:template>
<xsl:value-of select="title"/>
<xsl:value-of select="artist"/>
</xsl:for-each>
</xsl:template>
Ahora sí obtenemos todos los textos de los elementos title y de los elementos artist
Ejercicio
Realizad una hoja de estilos que nos proporcione el
siguiente resultado. Por supuesto utilizando for-each.
xsl:if
Se utiliza para producir un comportamiento condicional.
Sólo podemos preguntar por una condición y actuar si la condición
es cierta.
No existe una rama del sino (else)
Tiene un atributo obligatorio test=“expresion” (es una expresión
como las que se pueden poner en Xpath)
La instrucción de cierre es: </xsl:if>
<xsl:for-each select="catalog/cd">
<xsl:if test="price > 10">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:if>
</xsl:for-each>
Ejercicios
Realizad el ejercicio anterior, pero poniendo cada fila
de la tabla de un color según sean pares o impares.
Si sólo tengo un libro que contenga la etiqueta imagen,
evitad que salga “algo” vacío en el resto de libros.
Extraed los títulos de los libros de Mario Vargas Llosa
xsl:sort
Envía a la salida datos del documento xml ordenados
por algún criterio.
Los atributos opcionales son:
select: indica los nodos a ordenar (expresión xpath).
data-type: especifica el tipo de datos a ordenar(numbre,
text)
order: los valores son ascending o descending
case-order: especifica si las letras minúsculas (lower-
first) o mayúsculas (upper-first) aparecen primero al
ordenar.
xsl:sort
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
Ejercicio
Sacad un listado de los autores ordenados de distintas
formas: alfabéticamente en orden ascendente, en
orden descendente
Intentadlo con los libros por fecha de publicación
Ídem que antes, pero a misma fecha de publicación por
orden alfabético.
xsl:choose, xsl:when,
xsl:otherwise
Permiten implementar un comportamiento
condicional con múltiples opciones y una opción por
defecto (similar al switch)
El elemento <xsl:choose> se usa junto con <xsl:when>
y <xsl:otherwise> para expresar una elección múltiple.
Si la condición <xsl:when> es falsa, se procesa el
código de <xsl:otherwise>.
Sigue el formato:
<xsl:choose>
<xsl:when test=“expresion”> … </xsl:when>
<xsl:when test=“expresion”> … </xsl:when>
<xsl:when test=“expresion”> … </xsl:when>
<xsl:otherwise>…</xsl:otherwise>
</xsl:choose>
Ejemplo
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<xsl:choose>
<xsl:when test="price > 10">
<td bgcolor="#ff00ff">
<xsl:value-of select="artist"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="artist"/></td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
Ejemplo transformación XSLT
Documento XML
<?xml version=“1.0” encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="prueba.xsl" ?>
<ciudades>
<ciudad>
<nombre>Madrid</nombre>
<habitantes>3500000</habitantes> Hace referencia al
</ciudad> documento XSL
<ciudad>
<nombre>Málaga</nombre>
<habitantes>800000</habitantes>
</ciudad>
<ciudad>
<nombre>Toledo</nombre>
<habitantes>50000</habitantes>
</ciudad>
</ciudades>
Ejemplo transformación XSLT
Documento XSL
<?xml version="1.0" encoding=“utf-8”?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match=“//nombre">
<html>
Queremos los
<body> nombres de las
<h2> <xsl:value-of select="." /> </h2> ciudades
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Ejemplo transformación XSLT
Resultado
<h2>Madrid</h2>3500000
<h2>Málaga</h2>800000
<h2>Toledo</h2>50000
<xsl:sort select=“titulo”/>
Resumen 5
Patrones de búsqueda
= igualdad
!= desigualdad
< menor que ó <
> mayor que ó >
Tambien se pueden usar funciones como:
count()
position() / biblioteca/libro[position()<3]
last() /biblioteca/libro [last()]
O notación array : /biblioteca/libro[1] (1ºlibro)
Resumen 6
Plantillas
En un mismo documento puedo aplicar varias plantillas por
zonas del documento
El documento se procesa por nodos del árbol, podemos
especificar estilos según se navega por esos nodos
Para ello tenemos varias etiquetas relacionadas con la
aplicación de las plantillas:
<xsl:template match…>
<xsl:apply-templates/> (que aplica el resto de plantillas definidas en
cuanto se cumpla su patrón match)
<xsl:apply-templates select=“XXX”/>
Aplicar la plantilla XXX en ese momento
<xsl:value-of-select=”.” />
Se copia el valor del nodo actual en la plantilla actual