You are on page 1of 29

Ciclo Formativo de Grado Superior en Administracin y de Sistemas Informticos en Red

IES Valle del Cidacos Calahorra

Lenguajes de Marcas y Sistemas Gestores de Informacin

Enrique Rivas Marco

Usted es libre de:


Compartir copiar y redistribuir el material en cualquier medio o formato
Adaptar remezclar, transformar y crear a partir del material
El licenciador no puede revocar estas libertades mientras cumpla con los trminos de la licencia.
Bajo las condiciones siguientes:
Reconocimiento Debe reconocer adecuadamente la autora, proporcionar un enlace a la
licencia e indicar si se han realizado cambios<. Puede hacerlo de cualquier manera razonable,
pero no de una manera que sugiera que tiene el apoyo del licenciador o lo recibe por el uso que
hace.
NoComercial No puede utilizar el material para una finalidad comercial.
CompartirIgual Si remezcla, transforma o crea a partir del material, deber difundir sus
contribuciones bajo la misma licencia que el original.
No hay restricciones adicionales No puede aplicar trminos legales o medidas
tecnolgicas que legalmente restrinjan realizar aquello que la licencia permite.

eXtensible Stylesheet Language for Transformations, XSLT.


1. Introduccin a XSLT ......................................................................................................... 3
2. Aplicar al documento XML una hoja de estilos XSLT ................................................. 8
3. <xsl:template>.................................................................................................................... 9
4. <xsl:value-of>................................................................................................................... 10
5. <xsl:apply-templates> .................................................................................................... 11
6. <xsl:apply-templates> y <xsl:value-of> ....................................................................... 11
7. <xsl:sort> .......................................................................................................................... 13
8. Slo la plantilla raz <xsl:for-each> .............................................................................. 15
9.

Estructuras condicionales <xsl:if>...................................................................................... 15

10. <xsl:choose> / <xsl:when> / <xsl:otherwise>............................................................. 16


11. Generar contenido <xsl:text> ........................................................................................ 17
12. <xsl:element> / <xsl:attribute> ...................................................................................... 17
13. XSLT En el cliente con JavaScript ............................................................................... 18
14. XSLT en el servidor con PHP ........................................................................................ 19
15. Convertir XML en PDF utilizando XSL-FO y FOP....................................................... 20
Bloque 1 de ejercicios XSLT ......................................................................................................... 24
Bloque 2 de ejercicios XSLT ......................................................................................................... 25
Bloque 3 de ejercicios XSLT ......................................................................................................... 27
16. Bibliografa.................................................................................................................................. 29

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 es el lenguaje de hojas de estilo recomendado de XML.

XSLT es mucho ms sofisticado que el CSS.

XSLT puede ser utilizado para transformar documentos XML en HTML, antes de
ser mostrados en un navegador.

XSLT usa XPath para encontrar informacin en un documento XML. XPath se


utiliza para navegar a travs de elementos y atributos en documentos XML.

El funcionamiento lo podemos observar en la siguiente imagen:

A un documento XML se le pueden aplicar una o varias transformaciones XSLT e incluso


una transformacin CSS. No debemos confundir las transformaciones XSLT con la
presentacin de documentos XML con CSS. Con XSLT, generaremos un documento
HTML a partir de un documento XML. Con CSS, el navegador recibe un documento XML
que formatea utilizando las reglas CSS para presentarlo en pantalla de forma que sea
ms fcilmente legible, pero es el mismo documento.
Las hojas de estilos XSLT son ms tiles que las hojas de estilos CSS porque:

Permiten cambiar el orden los elementos.

Permiten realizar operaciones con sus valores.

Permiten agrupar elementos.

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>

<?xml version="1.0" encoding="UTF-8"?>


<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<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>

En otros ejemplos vamos a tomar como referencia el siguiente documento XML:


<?xml version="1.0" encoding="UTF-8"?>
<bib url="http://www.ticarte.com">
<book id="1">
<title>TCP/IP Illustrated</title>
<author>Stevens</author>
<publisher>Addison-Wesley</publisher>
<year>2002</year>
</book>
<book id="2">
<title>Advanced Programming in the Unix Environment</title>
<author>Stevens</author>
<publisher>Addison-Wesley</publisher>
<year>2004</year>
</book>
<book id="3">
<title>Data on the Web</title>
<author>Abiteboul</author>
<author>Buneman</author>
<author>Suciu</author>
<year>2006</year>
</book>
</bib>

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

Incluir la referencia a la hora de estilos en el documento xml:


<?xml-stylesheet type="text/xsl" href="ej1.xsl"?>

Una hoja de estilo XSLT es un documento XML. Debe estar bien formado.

Deben comenzar con una declaracin XML: <?xml version="1.0"?>

El elemento raz de la hoja de estilo XSLT es <xsl:stylesheet...

Este elemento contendr a todos los dems, y va precedido por el alias xsl
correspondiente al espacio de nombres para hojas de estilo XSLT.

La estructura bsica de un documento XSLT es la que se muestra a continuacin:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
</xsl:stylesheet>

En este caso, al no contener ninguna regla de transformacin, todos los nodos se


enviarn por defecto a la salida de la transformacin.
3. <xsl:template>
Se utiliza para construir plantillas, cada regla se define con un elemento <xsl:template>.
El atributo match se utiliza para asociar la plantilla a un elemento XML. El atributo match
tambin puede usarse para definir una plantilla para todo el documento XML (eje. Match =
"/" define todo el documento).
El valor del atributo match es una expresin XPath:
Expresin

Descripcin

nombrenodo

Selecciona todos los nodos secundarios del nodo nombrenodo

Selecciona la raz del documento

//

Selecciona los nodos en el documento desde el nodo actual que


coincidan con la seleccin sin importar donde se encuentren

Selecciona el nodo actual

..

Selecciona el padre del nodo actual

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.

<?xml version="1.0" encoding="UTF-8"?>


<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td>.</td>
<td>.</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Explicacin: El elemento <xsl:template> define una plantilla. El atributo match="/" asocia la


plantilla con la raz del documento XML de origen. El contenido dentro de la etiqueta
<xsl:template> define contenido HTML para escribir a la salida.
Las dos ltimas lneas definen el final de la plantilla y el final de la hoja de estilo.
El resultado de este ejemplo fue un poco decepcionante, ya que no hay datos que se
copien del documento XML a la salida.
Ahora veremos cmo utilizar el <xsl:value-of> para seleccionar los valores de los
elementos XML.
4. <xsl:value-of>
Puede ser utilizado para extraer el valor de un elemento XML y aadirlo a la cadena de
salida de la transformacin:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0">
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td><xsl:value-of select="catalog/cd/title"/></td>
<td><xsl:value-of select="catalog/cd/artist"/></td>
</tr>
</table>
</body>
</xsl:template>
</xsl:stylesheet>

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>

Tambin se puede utilizar <xsl:apply-templates> sin seleccionar ningn nodo concreto, de


esa manera se aplicarn todas las plantillas que existan para los nodos que se recorran.
Si en el ejemplo anterior no utilizamos "select" dentro de la plantilla "book" se mostrar
por salida todos los datos de los nodos que contenga dentro "book", existan o no sus
plantillas.
<!-- Plantilla raz -->
<xsl:template match="/">
<xsl:apply-templates select="bib/book" />
</xsl:template>
<!-- Plantilla book -->
<xsl:template match="/bib/book">
<xsl:apply-templates />
</xsl:template>
<!-- Plantilla title -->
<xsl:template match="/bib/book/title">
<xsl:value-of select="." />
</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".

data-type: "text | number | qname".

order: "ascending | descending".

case-order: "upper-first | lower-first".

<!-- Plantilla bib -->


<xsl:template match="/bib">
<ul>
<xsl:apply-templates select="book">
<xsl:sort select="title" order="ascending" />
</xsl:apply-templates>
</ul>
</xsl:template>

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

8. Slo la plantilla raz <xsl:for-each>


El mismo ejemplo anterior se puede realizar utilizando solamente la plantilla raz y
haciendo uso de la etiqueta <xsl:for-each>, que permite pasar por todos los nodos
seleccionados, como si se tratara de un bucle "for" en programacin:
<!-- Plantilla raz -->
<xsl:template match="/">
<html>
<head>
</head>
<body>
<xsl:for-each select="bib">
<ul>
<xsl:for-each select="book">
<li>
<xsl:value-of select="title" />
</li>
</xsl:for-each>
</ul>
</xsl:for-each>
</body>
</html>
</xsl:template>

9. Estructuras condicionales <xsl:if>


<xsl:if test="expression">
...some output if the expression is true...
</xsl:if>
La etiqueta <xsl:if> permite introducir una condicin en la transformacin mediante una
condicin evaluada mediante XPath en el atributo "test". Pero tan simple que no admite ni
siquiera la opcin "else". Hay que tener en cuenta que para utilizar los operadores "mayor
que" y "menor que" hay reemplazarlos por su carcter codificado en HTML.

Mayor que: &gt;

Menor que: &lt;


<!-- Plantilla year -->
<xsl:template match="/bib/book/year">
<xsl:if test=". &gt; 2000">
<strong><xsl:value-of select="." /></strong>
</xsl:if>
<xsl:if test=". &lt; 2000">
<xsl:value-of select="." />
</xsl:if>
</xsl:template>

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 &gt; 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>

10. <xsl:choose> / <xsl:when> / <xsl:otherwise>


La estructura "choose" es similar al "switch" de los lenguajes de programacin,
permitiendo condiciones consecutivas:
<xsl:choose>
<xsl:when test="expression">
... some output ...
</xsl:when>
<xsl:otherwise>
... some output ....
</xsl:otherwise>
</xsl:choose>
<!-- Plantilla year -->
<xsl:template match="/bib/book/year">
<xsl:choose>
<xsl:when test=". &gt; 2000">
<strong><xsl:value-of select="." /></strong>
</xsl:when>
<xsl:when test=". &gt; 2000">
<em><xsl:value-of select="." /></em>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:template>

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>

11. Generar contenido <xsl:text>


En algunas ocasiones necesitaremos texto literal en la salida, por ejemplo espacios en
blanco para separar valores. En este caso utilizaremos la etiqueta <xsl:text> con su
cdigo correspondiente:
<!-- Plantilla year -->
<xsl:template match="/bib/book/year">
(<xsl:text>&#10;</xsl:text>
<xsl:value-of select="." />
<xsl:text>&#10;</xsl:text>)
</xsl:template>

12. <xsl:element> / <xsl:attribute>


Cuando tengamos que crear nodos nuevos en el documento de salida, con su etiquetas y
atributos necesitaremos utilizar las etiquetas <xsl:element> y <xsl:attribute> para poder
utilizar los valores del XML origen en dichos nodos. En el siguiente ejemplo crearemos
enlace mediante HTML, es decir, una etiqueta "a" con el atributo "href" utilizando el
atributo "url" del nodo "bib":
<!-- Pantilla bib -->
<xsl:template match="/bib">

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>

13. XSLT En el cliente con JavaScript


Hasta ahora hemos transformado xml enlazando una hoja de transformacin xsl, con la
etiqueta <?xml-stylesheet type="text/xsl" href="ej1.xsl"?>, una solucin ms verstil sera
usar un JavaScript para hacer la transformacin:
<html>
<head>
<script>
function loadXMLDoc(filename)
{
if (window.ActiveXObject)
{
xhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
else
{
xhttp = new XMLHttpRequest();
}
xhttp.open("GET", filename, false);
try {xhttp.responseType = "msxml-document"} catch(err) {} // Helping IE11
xhttp.send("");
return xhttp.responseXML;
}
function displayResult()
{
xml = loadXMLDoc("cdcatalog.xml");
xsl = loadXMLDoc("cdcatalog.xsl");
// code for IE
if (window.ActiveXObject || xhttp.responseType == "msxml-document")
{
ex = xml.transformNode(xsl);
document.getElementById("example").innerHTML = ex;
}
// code for Chrome, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml, document);
document.getElementById("example").appendChild(resultDocument);
}
}
</script>

</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

15. Convertir XML en PDF utilizando XSL-FO y FOP


XSL-FO, un lenguaje de formateo, que no es ms que un vocabulario XML para
especificar objetos de formateo (FO).
Mediante los objetos de formateo (Formatting Objects -FO-) y sus propiedades
podemos describir cmo se van a visualizar los componentes de un documento.
Con estos objetos definimos:

Las caractersticas de la pgina.

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

Seguimos con el ejemplo de XSL-FO, una vez visto xsl,


estaremos familiarizados con los lenguajes
de trasnsformacin.
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>

El FOP (Formatting Object to PDF) es el primer procesador de objetos de formateo


XSL que aparecio. Empez a ser desarrollada en solitario por James Tauber pero
posteriormente se incorpor al "Apache XML Project" lo que est acelerando su
desarrollo.
Es una aplicacin en Java por lo que para poder utilizarla el nico requisito
necesario es tener instalado la mquina virtual Java.
Instalacion fop en linux
sudo apt-get install fop
En Windows ir a https://xmlgraphics.apache.org/fop/ descargar la distribucin
binaria y descomprimir.
Podemos probar con el archivo fo anterior "fop -fo prueba.fo -pdf prueba.pdf" crear
un pdf con el contenido especificado:

Propiedades y regiones de la pgina

Mediante el atributo page-width establecemos el ancho de la pgina.

Mediante el atributo page-height establecemos el alto de la pgina.

Podemos establecer los mrgenes de la pgina con los atributos margin-top,


margin-bottom, margin-left y margin-right.

Las regiones que forman la pgina son:

fo:region-body Cuerpo de la pgina

fo:region-before Encabezado

fo:region-after Pie de pgina

fo:region-start Margen izquierdo

fo:region-end. Margen derecho

21

El atributo extent da la altura de las regiones before y after, y la anchura para


start y end.
Para la regin body no podemos usar extend, usamos margin.
Ejemplo:
<fo:layout-master-set>
<fo:simple-page-master master-name='plantilla'
page-width='8.5in' page-height='11in'
margin-top='0.5in' margin-bottom='0.5in'
margin-left='0.5in' margin-right='0.5in'>
<fo:region-start extent='1.0in'/>
<fo:region-before extent='1.0in'/>
<fo:region-body margin='1.0in'/>
<fo:region-end extent='1.0in'/>
<fo:region-after extent='1.0in'/>
</fo:simple-page-master>
</fo:layout-master-set>

Las imgenes y sus atributos


Los formatos soportados son: .gif, .jpg, .svg y .png
Se insertan imgenes con el elemento fo:external-graphic, de la siguiente manera:
<fo:external-graphic src='cup.gif'/>

El enlace a la imagen puede ser tanto relativo como absoluto.

Generalmente lo que interesa es generar un documento PDF a partir de un


documento XML, lo vemos en el siguiente ejemplo:
Sea nombres.xml un archivo en siguiente contenido:
<?xml version="1.0" encoding="UTF-8"?>
<names>
<name>enrique</name>
<name>pedro</name>
<name>paz</name>
</names>

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>

La siguiente orden ejecuta los dos pasos anteriores en lnea de comandos:


fop -xml name.xml -xsl namefo.xsl -pdf name.pdf

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

Bloque 1 de ejercicios XSLT


<?xml version="1.0" encoding="UTF-8"?>
<ies nombre="IES Francisco de los Rios"
web="http://www.iesfranciscodelosrios.es" >
<ciclos>
<ciclo id="ASIR">
<nombre>Administracin de Sistemas Informticos en Red</nombre>
<grado>Superior</grado>
<decretoTitulo ao="2009" />
</ciclo>
<ciclo id="DAW">
<nombre>Desarrollo de Aplicaciones Web</nombre>
<grado>Superior</grado>
<decretoTitulo ao="2010" />
</ciclo>
<ciclo>
<nombre>Desarrollo de Aplicaciones Multiplataforma</nombre>
<grado>Superior</grado>
<decretoTitulo ao="2010" />
</ciclo>
<ciclo id="SMR">
<nombre>Sistemas Microinformticos y Redes</nombre>
<grado>Medio</grado>
<decretoTitulo ao="2008" />
</ciclo>
</ciclos>
</ies>

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 los nombres de los ciclos sin etiquetas.

Mostrar en prrafos cada uno de los nombres de los ciclos.

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.

Generar un documento PDF con los datos del documento XML.

24

Bloque 2 de ejercicios XSLT


<?xml version="1.0" encoding="UTF-8"?>
<bib url="http://www.uco.es/servicios/biblioteca/">
<libro ao="1994">
<titulo>TCP/IP Illustrated</titulo>
<autor>
<apellido>Stevens</apellido>
<nombre>W.</nombre>
</autor>
<editorial>Addison-Wesley</editorial>
<precio>65.95</precio>
</libro>
<libro ao="1992">
<titulo>Advan Programming for Unix environment</titulo>
<autor>
<apellido>Stevens</apellido>
<nombre>W.</nombre>
</autor>
<editorial>Addison-Wesley</editorial>
<precio>65.95</precio>
</libro>
<libro ao="2000">
<titulo>Data on the Web</titulo>
<autor>
<apellido>Abiteboul</apellido>
<nombre>Serge</nombre>
</autor>
<autor>
<apellido>Buneman</apellido>
<nombre>Peter</nombre>
</autor>
<autor>
<apellido>Suciu</apellido>
<nombre>Dan</nombre>
</autor>
<editorial>Morgan Kaufmann editorials</editorial>
<precio>39.95</precio>
</libro>
<libro ao="1999">
<titulo>Economics of Technology for Digital TV</titulo>
<editor>
<apellido>Gerbarg</apellido>
<nombre>Darcy</nombre>
<afiliacion>CITI</afiliacion>
</editor>
<editorial>Kluwer Academic editorials</editorial>
<precio>129.95</precio>
</libro>
</bib>

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

2. Autores del libro mostrando primero el nombre y luego el apellido. Si hay ms


de un autor se muestran todos en la misma celda. Si no hay autor se deja en
blanco.
3. Editores del libro mostrando el nombre, el apellido y la afiliacin. Si hay ms de
un editor se muestran todos en la misma celda. Si no hay editor se deja en
blanco.

Mostrar una tabla con las siguientes columnas:


1. Precio del libro, ordenando los resultados por este campo (Nota: se ordenan
como si fueran cadenas y no nmeros).
2. Ttulo del libro. Se mostrar el fondo de la celda en color rojo si el precio es
mayor de 100.
3. Ao de publicacin. Se mostrar el texto en cursiva.

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

Bloque 3 de ejercicios XSLT


<catalogo>
<artistas>
<artista id="uno">
<nombre>Carlos Jean</nombre>
<nacionalidad>Espaa</nacionalidad>
</artista>
<artista id="dos">
<nombre>Miguel Rios</nombre>
<nacionalidad>Espaa</nacionalidad>
</artista>
<artista id="tres">
<nombre>La Mala</nombre>
<nacionalidad>Espaa</nacionalidad>
</artista>
<artista id="cuatro">
<nombre>Etta James</nombre>
<nacionalidad>USA</nacionalidad>
</artista>
</artistas>
<discograficas>
<discografica id="uno">
<nombre>Motown</nombre>
<nacionalidad>USA</nacionalidad>
</discografica>
<discografica id="dos">
<nombre>Subterfuge</nombre>
<nacionalidad>Espaa</nacionalidad>
</discografica>
<discografica id="tres">
<nombre>Sony</nombre>
<nacionalidad>USA</nacionalidad>
</discografica>
</discograficas>
<cds>
<cd autor="uno" disc="dos">
<titulo>Bad Jean</titulo>
<precio>15</precio>
<ao>2000</ao>
</cd>
<cd autor="dos" disc="tres">
<titulo>Rock and Rios</titulo>
<precio>12</precio>
<ao>1982</ao>
</cd>
<cd autor="tres" disc="tres">
<titulo>Malamarismo</titulo>
<precio>10.90</precio>
<ao>2008</ao>
</cd>
<cd autor="cuatro" disc="uno">
<titulo>At last</titulo>
<precio>13</precio>
<ao>1979</ao>
</cd>
<cd autor="cuatro" disc="uno">
<titulo>Chess soul sisters</titulo>
<precio>16</precio>
<ao>1980</ao>
</cd>
<cd autor="dos" disc="dos">
<titulo>Michael Rios</titulo>

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 lista con los autores espaoles.

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.

Generar un documento PDF con los datos del archivo XML

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/

Rafa Morales, educacin, ciclos formativos, Lenguaje de marcas y sistemas de


gestin de la informacin. ". Licencia CC BY-CN-SA. http://www.ticarte.com/

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

w3schools.com, XSLT Tutorial. http://www.w3schools.com/xsl/default.asp

29

You might also like