Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LM - Ut 7 XSLT
LM - Ut 7 XSLT
Índice de contenido
1 Transformaciones de documentos XML...........................................................................................2
2 Formas de transformación de documentos XML..............................................................................2
2.1 CSS y XML...............................................................................................................................2
2.2 XSLT..........................................................................................................................................3
2.3 XSL-FO.....................................................................................................................................3
3. Transformación XSLT......................................................................................................................4
4. Primeros pasos con XSLT................................................................................................................5
4.1 Un primer ejemplo de hoja de estilo básica...............................................................................5
4.2 Explicación del código usado....................................................................................................7
5. Profundizando.................................................................................................................................10
6. Elementos XSL...............................................................................................................................13
7. Referencias a elementos XML.......................................................................................................13
9. Otros elementos XSL.....................................................................................................................15
10. Consideraciones de uso................................................................................................................15
Ejercicios............................................................................................................................................16
Anexo. Referencia de elementos XSLT..............................................................................................17
Para documentos XML también podemos definir estilos CSS para “renderizar” el contenido (y
valores de atributos) de los elementos presentes en un navegador como si fuera documento HTML.
Además existe otra opción parecida pero diferente que es la transformación del documento XML a
cualquier otro tipo de documento haciendo uso del estándar XSLT.
• CSS y XML
• XSLT
• XSL-FO
titulo {
color: red;
}
AVISO: Si un documento XML enlaza a una hoja de estilo, los navegadores ya no muestran el
documento completo con las etiquetas, sino el contenido aplicando las hojas de estilos.
Ejercicios
E.1 Realiza la transformación XML por CSS del ejemplo anterior y captura una imagen de
los códigos CSS y XML en VSCode y del navegador donde se aprecie el estilo usado.
Recuerda incluir todo el código en la captura y siempre formateado completamente.
E.2 Haz los mismos pasos con un ejemplo más extenso creado con estos documentos de la
web de w3schools.com (en este caso el número de líneas es alto por lo que la captura contendrá solo
las primeras líneas visibles pero completas).
▪ The CD catalog
▪ The CSS file
2.2 XSLT
XSLT viene de Extensible Stylesheet Language Transformations, o lenguaje de transformaciones basado
en hojas de estilo.
2.3 XSL-FO
XSL-FO viene de Formatting Objects, objetos de formateo. Su objetivo es crear transformaciones
para fotocomposición, como puede ser PDF (el formato de Adobe). Un ejemplo es:
<fo:page-sequence master-reference="hola">
<fo:flow>
<fo:block>Hola, mundo</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Para realizar la transformación es necesario usar una aplicación específica llamada “procesador de
XSL-FO”. Los procesadores XSL-FO libres más conocidos son FOP y PassiveTeX.
3. Transformación XSLT
Objetivo de XSLT.
XSLT es un lenguaje que se usa para convertir documentos XML en otros documentos XML.
Puede convertir un documento XML que obedezca a un DTD a otro que obedezca otro diferente, un
documento XML bien formado (no válido) a otro que siga un DTD, o, lo más habitual, convertirlo a
"formatos finales", tales como XHTML o vCard.
href a .xsl
origen.xml
origen.xml transformador.xsl (documento
(templates) transformado)
El estilo de programación con las hojas XSLT es totalmente diferente a otros lenguajes (como C++
o Perl), pareciéndose más a "lenguajes" tales como el AWK, o a otros lenguajes funcionales, como
Scheme. Se asemeja al lenguaje visto en el tema anterior XML Schema.
En resumen, programar con las hojas XSLT puede ser un poco frustrante, pero cuando uno aprende
a usarlas, no dejará de usarlas para estos fines. En realidad, son la única alternativa cuando uno
quiere adaptar un contenido descrito con XML a diferentes clientes (por ejemplo, otras aplicaciones,
móviles de diferente tamaño, diferentes navegadores), y la mejor alternativa cuando uno quiere
procesar documentos XML.
clientes.xml clientes.xml
internos.xml internos.xml
estilos_empresa.xsl
fabrica.xml fabrica.xml
fiscales.xml clientes.xml
fiscales.xml
fabrica.xml
intenos.xml
En realidad, para editar XML y XSLT no hace falta ningún editor especial, pero viene bien un editor
de XML o incluso un entorno integrado como VSCode que te ayude a indentar o formatear bien el
código, e incluso a cerrar las etiquetas en el orden correcto, o que te muestre la etiqueta y atributos
admisibles en cada momento en función del DTD u otro documento de definición de tipo.
Este ejemplo lo iremos extendiendo hasta que contenga un catálogo de una tienda virtual. Por lo
pronto incluimos solamente datos básicos sobre la tienda.
Si abrimos este documento con un navegador web no saldrá directamente el código XML, pues no
es una página web Para transformar este documento XML en una página web tendremos que
incluir una segunda línea con la siguiente información necesaria para realizar la transformación.
Esta línea solo difiere de la vista en el anterior apartado 2.1 para transformar con CSS en el valor
del atributo type, que ahora es "text/xsl" y antes "text/css".
Esto significa que cuando un documento XML contenga una línea xml-stylesheet, indicando el
documento .xsl que contiene las plantillas a aplicar en la transformación de hojas de estilo
(stylesheet), bastará con abrir el documento XML con el navegador, que se encargará de realizar la
transformación.
En el caso de que el archivo indicado en el atributo href no exista o erremos el nombre de este
atributo, lo que hace el navegador es transformar el documento XML a todo el texto contenido
dentro de todos los elementos, es decir todos los contenidos.
Prueba
P.1. Prueba el ejemplo visto en el apartado 2.1 cambiando el valor de href, por ejemplo de la forma:
Siguiendo con nuestra tienda0 la ampliamos pasando al documento tienda1.xml que queda así:
Prueba
P.2. Abre el documento tienda1.xml con el contenido mostrado arriba y sin existir el documento .xsl que referencia. ¿Qué
sucede?.
Una vez probado lo anterior en nuestro primer ejemplo, usaremos la siguiente hoja de estilo
contenida en tienda1.xsl:
A partir de aquí puedes visualizar el contenido del documento tienda1.xml con un navegador
transformándolo con la hoja de estilo tienda1.xsl. El resultado será el siguiente:
La tiendecilla 953 87 12 23
<html>
<head><title>Generado con tienda1.xsl</title></head>
<body>
<h1> La tiendecilla 953 87 12 23 </h1>
</body>
</html>
Documento .xml
Según vemos en el código del documento XML tienda1.xml, donde aparece en rojo todo lo
relativo a elementos referentes a XML, en color negro los elementos del documento y en color azul
el contenido de esos elementos:
se aprecia que:
• Contiene un elemento tienda, que incluye otros dos elementos hijos, nombre y telefono,
que contienen el texto que queremos que aparezca en la página web.
• La primera línea simplemente describe que el documento es XML.
• La segunda línea, como se ha dicho antes, asocia la hoja de estilo XSLT de transformación
(tienda1.xsl) al documento. Esta segunda línea la usan los procesadores de XSLT para
tomar el nombre de la hoja de estilo con la que se va a transformar; también la usan los
navegadores.
El XML original, como se ve, es simplemente XML bien formado, no usa un DTD ni lo necesita:
basta con que haya una etiqueta raíz (tienda, en nuestro caso), las etiquetas estén emparejadas
correctamente y los atributos entre comillas. Diferentes documentos XML podrían ser procesados
con la misma hoja de estilo, y darían diferente resultado.
Documento .xsl
Respecto a la primera hoja de estilo con la que nos enfrentamos vemos que es relativamente simple.
El "esqueleto" en color azul es un documento HTML normal, al cual tenemos que añadir
"contenido dinámico", es decir, contenido generado a partir del XML original. Para hacernos una
idea una hoja XSLT es como una plantilla sobre la que se cambian los contenidos por sus valores.
Para empezar, se incluyen una serie de instrucciones que modifican el aspecto de la salida.
• La primera declara el documento XML como ya se vió en unidades anteriores.
• La segunda es la etiqueta raíz xsl:stylesheet de la hoja de estilo, que se cierra( en la
última línea; recordemos que una hoja de estilo XSL es también un documento XML y por
tanto tiene que seguir todas sus convenciones. Declara la versión de XSLT que se está
usando y el espacio de nombres (namespace) que vamos a utilizar, es decir, el prefijo que
usarán todas las instrucciones propias de XSLT; en este caso, usamos xsl,
El código está organizado en "templates", que son partes de la hoja que se "disparan" cuando
encuentran una etiqueta que corresponda a lo que hay en su atributo match. El primer y único
template de esta hoja comienza en la línea 3 ( <xsl:template match='/'>), y, en este caso, el
template que corresponde a la etiqueta raíz / contiene el código HTML para generar un esqueleto de
página HTML.
La "orden" <xsl:apply-templates />en la línea 7 cede el control a los otros templates, es decir,
trata de aplicar todos los demás templates que haya en el documento para los hijos del elemento en
el que estamos ahora mismo (match=”/”), incluyendo el resultado de aplicarlos precisamente en ese
punto (es decir, entre las etiquetas h1. En este caso no hay más templates, salvo los llamados los
templates por defecto, que lo único que hacen es incluir el texto del contenido de las etiquetas
en el documento de salida.
En la práctica lo que hemos hecho es decirle dónde tiene que incluir en el esqueleto los valores del
documento original, sin procesarlos más.
La orden <xsl:apply-templates /> podría haberse sustituido, en este caso, por <xsl:value-of
select='tienda' /> y habría tenido exactamente el mismo efecto, es decir, incluir el contenido
de la etiqueta tienda (y todas las que descienden de ella).
Ejercicios
E.3 Crea los 2 documentos que se han definido aquí, transforma el documento XML
y observa el resultado obtenido.
E.4 Crea otro documento XML pero con otra etiqueta raíz, por ejemplo pelicula, y
observa qué efecto tiene en la salida transformándolo con el mismo .XSL.
E.5 Crear otro documento XML añadiendo varias etiquetas más, con diferentes
niveles de anidación, y aplicar la hoja de estilo, para ver qué efecto tiene.
5. Profundizando
Vamos a ampliar el documento XML anterior, tratando de procesar diferentes artículos de esta
tienda. La tienda virtual está formada por diferentes productos que a su vez tienen una serie de
características: código de producto, cantidad existente en stock y nombre del producto o artículo. El
documento tienda2.xml es el siguiente:
Los colores usados son los mismos que en el documento XML anterior.
Cuando añadimos a este documento, llamado tienda2.xml, la 2ª línea del caso anterior para
transformar el documento XML en un documento HTML, y habiendo creado el documento .xsl
correspondiente, obtendremos lo siguiente en el navegador al abrir el .xml:
Vemos que todos los productos existentes en el documento se han convertido en filas de una tabla
(tr, table row) del documento HTML, con cada dato de la tabla (td, table data) incluyendo el
correspondiente dato de cada producto.
<xsl:template match='tienda'>
<head>
<title><xsl:value-of select='nombre' />(Generado por xsl)</title>
</head>
<body>
<h1><xsl:value-of select='nombre' /></h1>
<h2>Teléfono: <xsl:value-of select='telefono' /></h2>
<h2>Nuestros mejores productos</h2>
<table>
<tr>
<th>Código</th>
<th>Existencias</th>
<th>Artículo</th>
</tr>
<xsl:apply-templates select='producto' />
</table>
</body>
</xsl:template>
<xsl:template match='producto'>
<tr><xsl:apply-templates /></tr>
</xsl:template>
<xsl:template match='codigo|cantidad|articulo'>
<td><xsl:apply-templates /></td>
</xsl:template>
</xsl:stylesheet>
Esta hoja se compone de cuatro templates diferentes (colores gris, celeste, naranja y azul), mientras
que la anterior hoja .xsl tenía solamente uno. Cada template trata elementos de diferente
profundidad dentro del árbol del documento XML: el primer template trataría la raíz, el segundo
las ramas que descienden de él, y el tercer y cuarto ramas progresivamente más bajas. Esto se hace
para realizar acciones distintas para cada elemento distinto de la jerarquía.
Por eso el primer template simplemente incluye el código de apertura y cierre del documento
HTML, y cede el control a los templates asociados al hijo del elemento /, es decir solamente al
template de su único hijo en este caso, que es tienda.
<xsl:template match='/'>
<html>
<xsl:apply-templates />
</html>
</xsl:template>
El siguiente template trata la etiqueta, tienda, tal como aparece (subrayado) en el atributo match.
<xsl:template match='tienda'>
<head>
<title><xsl:value-of select='nombre' />(Generado por xsl)</title>
</head>
<body>
<h1><xsl:value-of select='nombre' /></h1>
<h2>Teléfono: <xsl:value-of select='telefono' /></h2>
<h2>Nuestros mejores productos</h2>
<table border=”1”>
<tr>
<th>Código</th>
<th>Existencias</th>
<th>Artículo</th>
</tr>
<xsl:apply-templates select='producto' />
</table>
</body>
</xsl:template>
En este template se incluyen dentro del patrón en HTML el contenido del elemento nombre y del
telefono, usando xsl:value-of, que simplemente incluye el contenido del elemento indicado en
select. También se crea el esqueleto de una tabla en HTML, con su cabecera, y cede el control al
siguiente template, que se encargará de cada uno de los producto, para que se procesen sólo las
etiquetas de este tipo que desciendan de tienda, y no las otras (nombre, telefono), que ya están
incluidas antes en la transformación.
Para ello se usa el atributo select: detro de <xsl:apply-templates select='producto'>, que aplicará el
template a todos los elementos producto que existan como hijos del elemento de esta plantilla, es
decir de tienda.
El template de producto crea el esqueleto de una fila, cediendo el control a los templates que
traten con todos los descendientes.
<xsl:template match='producto'>
<tr><xsl:apply-templates /></tr>
</xsl:template>
Hay un sólo template que lo hace y en vez de procesar un sólo tipo de elemento, procesa 3, y para
ello usamos | para indicar que puede procesar cualquiera de ellos, incluyéndolos dentro de un
demarcador de celda de tabla en HTML.
<xsl:template match='codigo|cantidad|articulo'>
<td><xsl:apply-templates /></td>
</xsl:template>
entrada, es lo que se denomina orden de documento. Este orden se puede alterar usando etiquetas
value-of adecuadamente y usando otros métodos, que veremos a continuación
6. Elementos XSL
Hasta ahora hemos visto los siguientes elementos del lenguaje XSL:
• xsl:template: sirve para definir una plantilla (template) dentro del documento .xsl. Va
acompañado del atributo match para indicar el elemento al que corresponde esa plantilla. Si
varios elementos comparten la misma plantilla se pueden definir todos juntos usando el
separador |. Ver el ejemplo de la plantilla para codigo|cantidad|articulo.
La jerarquía de los elementos dentro del documento .xml hay que tenerla en cuenta en las templates.
Si dentro de un template del elemento A queremos acceder al valor de un elemento nieto N de A
tendremos que referenciar a través de su padre P, indicando la ruta. Por ejemplo:
Aparte de la referencia por nombres de elementos también podemos referenciar a los elementos
usando símbolos genéricos (como en los directorios de los sistemas operativos). Para indicar el
elemento padre se usa “..” mientras para el propio elemento en el que se define la template es “.”
Por otro lado, cuando queremos extraer del documento .xml en lugar del contenido de un elemento
el valor de un atributo lo haremos anteponiendo el carácter @ por delante del nombre del
atributo. Por tanto, cuando encontremos @ en una referencia de una plantilla de un elemento E no
se referirá a un elemento hijo de E sino a un atributo de E.
En el siguiente ejemplo, vemos como en la template se referencia con value-of primero al elemento
de la template (eaiz/elemento) con lo que se obtiene el contenido (“Texto_del_elemento”) y en el
segundo value-of se referencia al atributo llamado “atributo” del elemento “elemento”, cuyo valor
es “Valor_del_atributo”.
Aparte de los elementos del lenguaje XSL vistos en el apartado 6, existen muchos más. En esta
sección veremos los siguientes:
• xsl:copy-of: muy similar al visto anteriormente xsl:value-of, pero en este caso transforma
el contenido del elemento indicado en la select junto con las etiquetas de inicio y cierre de
ese elemento.
Se puede apreciar esta diferencia en el siguiente ejemplo:
En muchos casos no es necesario usar copy-of pero en algunos otros puede ser más eficiente
hacer uso de él. Por ejemplo, observa lo que sucedería en la salida transformada siguiente,
teniendo en cuenta que el documento XML tiene unos elementos con nombres “especiales”
para nuestro propósito:
• xsl:attribute: sirve para transformar un atributo con nombre indicado en name para el
elemento transformado que contiene este comando. Veámoslo con un ejemplo aclaratorio:
• Se pueden usar las templates todas las veces que se desee. Se pueden colocar todas las
xsl:appluy-templates que se quiera y donde se quiera.
• El uso del atributo select en xsl:apply-templates indica que plantilla se usará en ese lugar. La
cantidad de veces que se usa depende de la cantidad de veces que aparezca el elemento en el
documento .xml
• El atributo select es opcional. Si no se indica, con <xsl:apply-templates />, se aplicarán
plantillas para todos los hijos del elemento del template donde se ubica xsl:apply-templates.
• Cuando no queremos transformar todos los hijos del elemento del template, sino solo
alguno o algunos de ellos, no podremos usar <xsl:apply-templates /> sin select, pues
recogerá todos los hijos. Será necesario usar <xsl:apply-templates select=”hijo” />
Ejercicios
Elementos XSLT
Los enlaces en la columna "Elemento" apuntan a atributos e información más útil sobre cada elemento
específico.
Element Description
apply-imports Applies a template rule from an imported style sheet
Applies a template rule to the current element or to the current element's
apply-templates
child nodes
attribute Adds an attribute
attribute-set Defines a named set of attributes
call-template Calls a named template
Used in conjunction with <when> and <otherwise> to express multiple
choose
conditional tests
comment Creates a comment node in the result tree
copy Creates a copy of the current node (without child nodes and attributes)
copy-of Creates a copy of the current node (with child nodes and attributes)
Defines the characters and symbols to be used when converting numbers
decimal-format
into strings, with the format-number() function
element Creates an element node in the output document
Specifies an alternate code to run if the processor does not support an XSLT
fallback
element
for-each Loops through each node in a specified node set
if Contains a template that will be applied only if a specified condition is true
Imports the contents of one style sheet into another. Note: An imported style
import
sheet has lower precedence than the importing style sheet
Includes the contents of one style sheet into another. Note: An included style
include
sheet has the same precedence as the including style sheet
Declares a named key that can be used in the style sheet with the key()
key
function
message Writes a message to the output (used to report errors)
Replaces a namespace in the style sheet to a different namespace in the
namespace-alias
output
number Determines the integer position of the current node and formats a number
otherwise Specifies a default action for the <choose> element
output Defines the format of the output document
param Declares a local or global parameter
preserve-space Defines the elements for which white space should be preserved
processing-instruction Writes a processing instruction to the output
sort Sorts the output
strip-space Defines the elements for which white space should be removed
stylesheet Defines the root element of a style sheet
template Rules to apply when a specified node is matched