Professional Documents
Culture Documents
1. Introduccin a XSLT
XSLT (eXtensible Stylesheet Language for Transformations) es un lenguaje que permite
aplicar una transformacin a un documento XML para obtener otro documento XML, un
documento HTML o un documento de texto plano.
La hoja de estilos XSLT con las reglas de transformacin es tambin un documento de
texto XML en s, generalmente con extensin .xsl, por lo que se podr comprobar si
est bien formado o no.
XSLT puede ser utilizado para transformar documentos XML en HTML, antes de
ser mostrados en un navegador.
De ah que se suelan utilizar en combinacin ms que decantarse por una u otra hoja de
estilos.
Ejemplo inicial:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ej1.xsl"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<country>USA</country>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
</cd>
<cd>
<title>Still got the blues</title>
<artist>Gary Moore</artist>
<country>UK</country>
<company>Virgin records</company>
<price>10.20</price>
<year>1990</year>
</cd>
<cd>
<title>Eros</title>
<artist>Eros Ramazzotti</artist>
<country>EU</country>
<company>BMG</company>
<price>9.90</price>
<year>1997</year>
</cd>
<cd>
<title>One night only</title>
<artist>Bee Gees</artist>
<country>UK</country>
<company>Polydor</company>
<price>10.90</price>
<year>1998</year>
</cd>
<cd>
<title>Sylvias Mother</title>
<artist>Dr.Hook</artist>
<country>UK</country>
<company>CBS</company>
<price>8.10</price>
<year>1973</year>
</cd>
<cd>
<title>Maggie May</title>
<artist>Rod Stewart</artist>
<country>UK</country>
<company>Pickwick</company>
<price>8.50</price>
<year>1990</year>
</cd>
<cd>
<title>Romanza</title>
<artist>Andrea Bocelli</artist>
<country>EU</country>
<company>Polydor</company>
<price>10.80</price>
<year>1996</year>
</cd>
<cd>
<title>When a man loves a woman</title>
<artist>Percy Sledge</artist>
<country>USA</country>
<company>Atlantic</company>
<price>8.70</price>
<year>1987</year>
</cd>
<cd>
<title>Black angel</title>
<artist>Savage Rose</artist>
<country>EU</country>
<company>Mega</company>
<price>10.90</price>
<year>1995</year>
</cd>
<cd>
<title>1999 Grammy Nominees</title>
<artist>Many</artist>
<country>USA</country>
<company>Grammy</company>
<price>10.20</price>
<year>1999</year>
</cd>
<cd>
<title>For the good times</title>
<artist>Kenny Rogers</artist>
<country>UK</country>
<company>Mucik Master</company>
<price>8.70</price>
<year>1995</year>
</cd>
<cd>
<title>Big Willie style</title>
<artist>Will Smith</artist>
<country>USA</country>
<company>Columbia</company>
<price>9.90</price>
<year>1997</year>
</cd>
<cd>
<title>Tupelo Honey</title>
<artist>Van Morrison</artist>
<country>UK</country>
<company>Polydor</company>
<price>8.20</price>
<year>1971</year>
</cd>
<cd>
<title>Soulsville</title>
<artist>Jorn Hoel</artist>
<country>Norway</country>
<company>WEA</company>
<price>7.90</price>
<year>1996</year>
</cd>
<cd>
<title>The very best of</title>
<artist>Cat Stevens</artist>
<country>UK</country>
<company>Island</company>
<price>8.90</price>
<year>1990</year>
</cd>
<cd>
<title>Stop</title>
<artist>Sam Brown</artist>
<country>UK</country>
<company>A and M</company>
<price>8.90</price>
<year>1988</year>
</cd>
<cd>
<title>Bridge of Spies</title>
<artist>T`Pau</artist>
<country>UK</country>
<company>Siren</company>
<price>7.90</price>
<year>1987</year>
</cd>
<cd>
<title>Private Dancer</title>
<artist>Tina Turner</artist>
<country>UK</country>
<company>Capitol</company>
<price>8.90</price>
<year>1983</year>
</cd>
<cd>
<title>Midt om natten</title>
<artist>Kim Larsen</artist>
<country>EU</country>
<company>Medley</company>
<price>7.80</price>
<year>1983</year>
</cd>
<cd>
<title>Pavarotti Gala Concert</title>
<artist>Luciano Pavarotti</artist>
<country>UK</country>
<company>DECCA</company>
<price>9.90</price>
<year>1991</year>
</cd>
<cd>
<title>The dock of the bay</title>
<artist>Otis Redding</artist>
<country>USA</country>
<company>Atlantic</company>
<price>7.90</price>
<year>1987</year>
</cd>
<cd>
<title>Picture book</title>
<artist>Simply Red</artist>
<country>EU</country>
<company>Elektra</company>
<price>7.20</price>
<year>1985</year>
</cd>
<cd>
<title>Red</title>
<artist>The Communards</artist>
<country>UK</country>
<company>London</company>
<price>7.80</price>
<year>1987</year>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
</catalog>
Para disear hojas de estilos XSLT podemos utilizar el software libre XML Copy Editor.
Para probarlo slo tenemos que abrir el documento XML en el navegador Mozilla Firefox o
Internet Explorer para ver el resultado de la transformacin. El navegador Google
Chrome por defecto no aplica las transformaciones.
En el navegador podemos utilizar la opcin del botn derecho "Inspeccionar elemento"
para comprobar los resultados de la transformacin, ya que si elegimos "Ver cdigo
fuente" se nos abrir el documento XML original sin ninguna transformacin.
2. Aplicar al documento XML una hoja de estilos XSLT
Una hoja de estilo XSLT es un documento XML. Debe estar bien formado.
Este elemento contendr a todos los dems, y va precedido por el alias xsl
correspondiente al espacio de nombres para hojas de estilo XSLT.
Descripcin
nombrenodo
//
..
Selecciona atributos
La hoja de estilos debe tener al menos una plantilla que suele corresponder con el nodo
raz, aunque puede ser de otro nodo.
Si esta plantilla no contiene nada, como en el siguiente ejemplo, no se enviar nada como
salida de la transformacin:
<?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>
Si no hay plantillas, el procesador simplemente extrae el texto contenido por los nodos.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
</xsl:stylesheet>
Si hay una plantilla vaca, el procesador sustituye el nodo y todos sus subelementos por
nada
no
extrae
el
texto
contenido
por
ese
nodo
sus
subelementos.
Lo normal es que tengamos ms plantillas, una para cada nodo de nuestro documento
XML.
10
5. <xsl:apply-templates>
Utilizaremos la etiqueta <xsl:apply-templates> para mostrar en una plantilla la
transformacin de otra. Prestar atencin a los atributos que se utilizan, en <xsl:template>
se utiliza "match" y en <xsl:apply-templates> se utiliza "select".
En el siguiente ejemplo la plantilla raz transformar cada nodo "book" de su interior por
su plantilla. Hay que ver como las plantillas <xsl:template> utilizan rutas XPath absolutas
para identificar los nodos a los que hacen referencia, pero <xsl:apply-templates> utilizar,
normalmente, rutas XPath relativas al nodo de contexto en el que se est llamando. Este
ejemplo an no muestra nada en la salida.
<!-- Plantilla raz -->
<xsl:template match="/">
<xsl:apply-templates select="bib/book" />
</xsl:template>
<!-- Plantilla book -->
<xsl:template match="/bib/book">
</xsl:template>
6. <xsl:apply-templates> y <xsl:value-of>
En el interior de una plantilla podemos utilizar la etiqueta <xsl:value-of> para imprimir el
valor que contiene el nodo, utilizando expresiones XPath para acceder a ellas.
Tomaremos como nodo contexto el nodo en el que estamos trabajando o estamos
posicionados actualmente. El ejemplo anterior lo podemos modificar mostrando en la
plantilla "book" el contenido del nodo "title", para mostrar todos los ttulos de los libros:
<!-- Plantilla raz -->
<xsl:template match="/">
<xsl:apply-templates select="bib/book" />
</xsl:template>
<!-- Plantilla book -->
<xsl:template match="/bib/book">
<xsl:value-of select="title" />
</xsl:template>
En el ejemplo anterior hemos mostrado el valor del nodo "title" desde "book", pero
podemos crear tambin una nueva plantilla para el nodo "title" y que dicha plantilla
muestre directamente su valor de la siguiente manera. Mirar de nuevo cmo se utilizan las
rutas absolutas y relativas en Xpath.
<!-- Plantilla raz-->
<xsl:template match="/">
<xsl:apply-templates select="bib/book" />
</xsl:template>
<!-- Plantilla book -->
11
<xsl:template match="/bib/book">
<xsl:apply-templates select="title" />
</xsl:template>
<!-- Plantilla title -->
<xsl:template match="/bib/book/title">
<xsl:value-of select="." />
</xsl:template>
Si una plantilla lo nico que tiene es mostrar el valor de su nodo se podra eliminar,
obtenindose el mismo resultado. En el siguiente ejemplo eliminamos la plantilla del nodo
"title" y an as el resultado es el mismo que el ejemplo anterior:
<!-- Plantilla raz -->
<xsl:template match="/">
<xsl:apply-templates select="bib/book" />
</xsl:template>
<!-- Plantilla book -->
<xsl:template match="/bib/book">
<xsl:apply-templates select="title" />
</xsl:template>
Los atributos tambin pueden transformarse crendoles una plantilla como vemos en el
siguiente ejemplo:
<!-- Plantilla raz -->
<xsl:template match="/">
<xsl:apply-templates select="bib/book" />
</xsl:template>
<!-- Plantilla book -->
<xsl:template match="/bib/book">
<xsl:apply-templates select="@id" />
</xsl:template>
<!-- Plantilla atributo id -->
12
<xsl:template match="/bib/book/@id">
<xsl:value-of select="." />
</xsl:template>
Otro ejemplo:
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<p>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
<xsl:template match="title">
Title: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="artist">
Artist: <span style="color:#00ff00">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
</xsl:stylesheet>
7. <xsl:sort>
Se puede ordenar la salida de los nodos de una plantilla mediante la etiqueta <xsl:sort>
situndola dentro de las etiquetas <xsl:apply-templates>. Los siguientes atributos se
pueden utilizar con ella:
lang: "language-code".
13
<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">
<xsl:sort select="artist"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Ejemplo completo
En el siguiente ejemplo ms completo utilizaremos las plantillas para transformar el
documento XML a una lista con formato HTML donde cada elemento de la lista sea el
nombre del libro y el ao de publicacin entre parntesis, situando el cdigo HTML en sus
plantillas correspondientes:
<!-- Plantilla raz -->
<xsl:template match="/">
<html>
<head>
</head>
<body>
<xsl:apply-templates select="bib" />
</body>
</html>
</xsl:template>
<!-- Plantilla bib -->
<xsl:template match="/bib">
<ul>
<xsl:apply-templates select="book" />
</ul>
</xsl:template>
<!-- Plantilla book -->
<xsl:template match="/bib/book">
<li>
<xsl:apply-templates select="title" />
<xsl:apply-templates select="year" />
</li>
</xsl:template>
<!-- Plantilla title -->
<xsl:template match="/bib/book/title">
<xsl:value-of select="." />
</xsl:template>
<!-- Plantilla year -->
<xsl:template match="/bib/book/year">
(<xsl:value-of select="." />)
</xsl:template>
14
15
Otro ejemplo:
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
<th>Price</th>
</tr>
<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>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
16
Otro 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>
</xsl:stylesheet>
17
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="@url" />
</xsl:attribute> Visita la bibioteca
</xsl:element>
<ul>
<xsl:apply-templates select="book" />
</ul>
</xsl:template>
</head>
18
<body onload="displayResult()">
<div id="example" />
</body>
</html>
Ahora el documento xml no tiene que tener la referencia a la hoja de transformacin xsl, la
funcin de JavaScript se encarga de enlazarlos y mostrar la transformacin.
14. XSLT en el servidor con PHP
Para que los datos XML sean compatibles con todos los navegadores, podemos
transformar el documento XML en el servidor y enviar de vuelta al navegador como
XHTML.
<?php
// Load XML file
$xml = new DOMDocument;
$xml->load('cdcatalog.xml');
// Load XSL file
$xsl = new DOMDocument;
$xsl->load('cdcatalog.xsl');
// Configure the transformer
$proc = new XSLTProcessor;
// Attach the xsl rules
$proc->importStyleSheet($xsl);
echo $proc->transformToXML($xml);
?>
19
Los prrafos.
Las listas.
Las tablas.
Los enlaces.
Etc.
Ejemplo:
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simple"
page-height="29.7cm"
page-width="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="2.5cm"
margin-right="2.5cm">
<fo:region-body margin-top="3cm"/>
<fo:region-before extent="3cm"/>
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simple">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="20pt"
font-family="arial"
line-height="20pt"
space-after.optimum="15pt"
text-align="center"
padding-top="3pt">
Ejemplo de XSL-FO
</fo:block>
<fo:block font-size="14pt"
font-family="sans-serif"
line-height="14pt"
space-after.optimum="3pt"
text-align="justify">
20
fo:region-before Encabezado
21
Para crear un archivo PDF a partir de este archivo XML, se necesita una XSLT que
convierta el XML a XSL-FO. Este es el primer paso in la cadena de procesos. El
segundo paso ser dado por FOP cuando lea el documento XSL-FO generado y lo
convierta en un documento PDF:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="A4-portrait"
page-height="29.7cm" page-width="21.0cm" margin="2cm">
<fo:region-body/>
</fo:simple-page-master>
22
</fo:layout-master-set>
<fo:page-sequence master-reference="A4-portrait">
<fo:flow flow-name="xsl-region-body">
<xsl:for-each select="names/name">
<fo:block>
Hello, <xsl:value-of select="."/>!
</fo:block>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
Es posible dar formato de salida, veamos otra versin del ejemplo anterior:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/names">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="A4-portrait"
page-height="29.7cm" page-width="21.0cm" margin="2cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4-portrait">
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="name">
<fo:block font-size="2em" color="red" font-weight="bold" backgroundcolor="blue" margin="10px" padding="20px">
Hello, <xsl:value-of select="."/>!
</fo:block>
</xsl:template>
</xsl:stylesheet>
23
Dado el anterior documento XML y utilizando una plantilla (template) para cada nodo del
mismo que se necesite transformar, realiza las siguientes transformaciones XSLT:
Mostrar en una lista sin numerar los nombres de los ciclos ordenados, y entre
parntesis su grado.
Mostrar en una etiqueta H1 el nombre del instituto y luego en una tabla con su fila
encabezado las siguientes columnas, nombre del ciclo y ao. Si el ao es mayor al
2009 la letra ser de color verde, si es igual al 2009 de color azul y si es menor al
2009 de color rojo.
24
Dado el anterior documento XML y utilizando una plantilla (template) para cada nodo del
mismo que se necesite transformar, realiza las siguientes transformaciones XSLT:
Mostrar una tabla con las siguientes columnas ordenadas por el ttulo del libro:
1. Ttulo del libro, en color rojo si el precio es mayor de 100, aadindole el texto
"(Caro)" a continuacin.
25
Mostrar una lista enumerada con todos los autores ordenados por apellidos.
Mostrar una lista enumerada con todos los ttulos de libros cuyo precio sea menor
de 100.
26
27
<precio>10</precio>
<ao>1973</ao>
</cd>
<cd autor="uno" disc="dos">
<titulo>Party Stereo</titulo>
<precio>13</precio>
<ao>2009</ao>
</cd>
<cd autor="tres" disc="tres">
<titulo>Dirty Bailarina</titulo>
<precio>13</precio>
<ao>1979</ao>
</cd> </cds>
</catalogo>
Dado el anterior documento XML y utilizando una plantilla (template) para cada nodo del
mismo que se necesite transformar, realiza las siguientes transformaciones XSLT:
Mostrar una tabla con el nombre del disco en verde si el ao es posterior al 2000, y
en rojo si el ao es anterior al 2000.
28
16. Bibliografa
Sintes Marco, Bartolom. "Qu es el XML" y "XPath" del curso "XML: Lenguaje de
Marcas Extensible Licencia". Licencia CC BY-CN-SA. http://www.mclibre.org/
Taboada Len Juan Jos. Convertir XML en PDF utilizando XSL-FO y FOP.
Licencia
CC
BY-CN-SA.
http://docencia.taboadaleon.es/2015-02-13-07-38-
06/convertir-xml-en-pdf.html
29