Enreas
Advertisement

La primera transformación[]

Seguro que ya conoces este documento XML de capítulos anteriores:

<?xml version="1.0"?>
<pelicula>
	Brazil
	<director>Terry Gilliam</director>
	<actores>
		<actor>Jonathan Pryce</actor>
	</actores>
</pelicula>

Transforma dicho documento con el siguiente documento XSL:

<?xml version="1.0"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
<html>
	<head>
		<title>
			<xsl:value-of select="/pelicula/text()"/>
		</title>
	</head>
	<body>
		<h1><xsl:value-of select="/pelicula/text()"/></h1>
		<b>Director:</b>
		<xsl:value-of select="/pelicula/director"/><br/>
		<b>Protagonista:</b>
		<xsl:value-of select="/pelicula/actores/actor"/><br/>
	</body>
</html>
</xsl:template>
</xsl:stylesheet>

Para que esto funcione sólo será necesario hacer la siguiente modificación en el primer documento XML:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="brazil.xsl"?>
<pelicula>
	Brazil
	<director>Terry Gilliam</director>
	<actores>
		<actor>Jonathan Pryce</actor>
	</actores>
</pelicula>

Es interesante comprobar que, manteniendo el mismo documento XML, podemos realizar otra transformación con sólo cambiar de documento XSL:

<?xml version="1.0"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
<html>
	<head>
		<title>
			<xsl:value-of select="/pelicula/text()"/>
		</title>
	</head>
	<body>
		<b><xsl:value-of select="/pelicula/text()"/></b><br/>
		<u>Director</u>:<br/>
		<xsl:value-of select="/pelicula/director"/><br/>
		<u>Protagonista</u>:<br/>
		<xsl:value-of select="/pelicula/actores/actor"/><br/>
	</body>
</html>
</xsl:template>
</xsl:stylesheet>

Un documento más complejo[]

Aunque perfectamente válido para nuestros fines, el documento XML con el que hemos trabajado hasta ahora tiene ciertas limitaciones que no lo hacen adecuado para el resto de ejemplos que veremos. Por lo tanto, a partir de ahora éste será nuestro documento de ejemplo:

<?xml version="1.0"?>
<pelicula titulo="Brazil" estreno="1985" minutos="132">
	<direccion>
		<director nombre="Terry" apellidos="Gilliam"/>
	</direccion>
	<produccion>
		<productor nombre="Patrick" apellidos="Cassavetti"/>
		<productor nombre="Arnon" apellidos="Milchan"/>
	</produccion>
	<guion>
		<guionista nombre="Terry" apellidos="Gilliam"/>
		<guionista nombre="Tom" apellidos="Stoppard"/>
		<guionista nombre="Charles" apellidos="McKeown"/>
	</guion>
	<reparto>
		<interprete nombre="Jonathan" apellidos="Pryce"
			papel="protagonista"/>
		<interprete nombre="Robert" apellidos="De Niro"
			papel="protagonista"/>
		<interprete nombre="Kim" apellidos="Greist"
			papel="protagonista"/>
		<interprete nombre="Michael" apellidos="Palin"
			papel="secundario"/>
		<interprete nombre="Ian" apellidos="Holm"
			papel="secundario"/>
		<interprete nombre="Bob" apellidos="Hoskins"
			papel="secundario"/>
	</reparto>
</pelicula>

Sobre este documento haremos modificaciones cuando sea necesario.

La transformación más sencilla[]

Fíjate en este documento XML:

<?xml version="1.0"?>
<pelicula titulo="Brazil" estreno="1985" minutos="132">
	<direccion>
		<director nombre="Terry" apellidos="Gilliam"/>
	</direccion>
	<produccion>
		<productor nombre="Patrick" apellidos="Cassavetti"/>
		<productor nombre="Arnon" apellidos="Milchan"/>
	</produccion>
	<guion>
		<guionista nombre="Terry" apellidos="Gilliam"/>
		<guionista nombre="Tom" apellidos="Stoppard"/>
		<guionista nombre="Charles" apellidos="McKeown"/>
	</guion>
	<reparto>
		<interprete nombre="Jonathan" apellidos="Pryce"
			papel="protagonista"/>
		<interprete nombre="Robert" apellidos="De Niro"
			papel="protagonista"/>
		<interprete nombre="Kim" apellidos="Greist"
			papel="protagonista"/>
		<interprete nombre="Michael" apellidos="Palin"
			papel="secundario"/>
		<interprete nombre="Ian" apellidos="Holm"
			papel="secundario"/>
		<interprete nombre="Bob" apellidos="Hoskins"
			papel="secundario"/>
	</reparto>
</pelicula>

La transformación más sencilla que se puede realizar sobre él es la siguiente:

<?xml version="1.0"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:template match="/">
</xsl:template>
</xsl:stylesheet>

Copia de elementos[]

Un paso más con respecto al ejemplo anterior, la transformación más sencilla. En este caso se trata de tomar sólo parte de un documento XML y mostrarlo como resultado. Éste es el documento:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="brazil.xsl"?>
<pelicula titulo="Brazil" estreno="1985" minutos="132">
	<direccion>
		<director nombre="Terry" apellidos="Gilliam"/>
	</direccion>
	<produccion>
		<productor nombre="Patrick" apellidos="Cassavetti"/>
		<productor nombre="Arnon" apellidos="Milchan"/>
	</produccion>
	<guion>
		<guionista nombre="Terry" apellidos="Gilliam"/>
		<guionista nombre="Tom" apellidos="Stoppard"/>
		<guionista nombre="Charles" apellidos="McKeown"/>
	</guion>
	<reparto>
		<interprete nombre="Jonathan" apellidos="Pryce"
			papel="protagonista"/>
		<interprete nombre="Robert" apellidos="De Niro"
			papel="protagonista"/>
		<interprete nombre="Kim" apellidos="Greist"
			papel="protagonista"/>
		<interprete nombre="Michael" apellidos="Palin"
			papel="secundario"/>
		<interprete nombre="Ian" apellidos="Holm"
			papel="secundario"/>
		<interprete nombre="Bob" apellidos="Hoskins"
			papel="secundario"/>
	</reparto>
</pelicula>

Ésta es la transformación:

<?xml version="1.0"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:template match="/">
<xsl:copy-of select="pelicula/direccion"/>
</xsl:template>
</xsl:stylesheet>

El resultado es:

<?xml version="1.0"?>
<direccion>
	<director nombre="Terry" apellidos="Gilliam"/>
</direccion>

Estructuras de control: iteraciones[]

La iteración es, con mucho, una de las instrucciones de control más utilizadas en XSL. Partiendo del documento XML que utilizamos en los ejemplos de este capítulo podemos obtener la lista de intérpretes de una película gracias a la siguiente transformación:

<?xml version="1.0" encoding="iso-8859-15"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
<html>
<head>
	<title>
		<xsl:value-of select="/pelicula/@titulo"/>
	</title>
</head>
<body>
	<b><xsl:value-of select="/pelicula/@titulo"/></b><br/>
	<u>Director</u>:<xsl:text> </xsl:text>
	<xsl:value-of
		select="/pelicula/direccion/director/@nombre"/>
	<xsl:text> </xsl:text>
	<xsl:value-of
		select="/pelicula/direccion/director/@apellidos"/>
	<br/>
	<u>Intérpretes</u>:<br/>
	<xsl:for-each select="/pelicula/reparto/interprete">
		<xsl:value-of select="@nombre"/>
		<xsl:text> </xsl:text>
		<xsl:value-of select="@apellidos"/><br/>
	</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Estructuras de control: condiciones simples[]

Una instrucción condicional permite determinar si una acción se llevará a cabo o no. Por ejemplo, la siguiente transformación muestra los datos de una película, omitiendo los nombres de los actores secundarios:

<?xml version="1.0" encoding="iso-8859-15"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
<html>
<head>
	<title>
		<xsl:value-of select="/pelicula/@titulo"/>
	</title>
</head>
<body>
	<b><xsl:value-of select="/pelicula/@titulo"/></b><br/>
	<u>Director</u>:<xsl:text> </xsl:text>
	<xsl:value-of
		select="/pelicula/direccion/director/@nombre"/>
	<xsl:text> </xsl:text>
	<xsl:value-of
		select="/pelicula/direccion/director/@apellidos"/>
	<br/>
	<u>Intérpretes</u>:<br/>
	<xsl:for-each select="/pelicula/reparto/interprete">
		<xsl:if test="@papel = 'protagonista'">
			<xsl:value-of select="@nombre"/>
			<xsl:text> </xsl:text>
			<xsl:value-of select="@apellidos"/><br/>
		</xsl:if>
	</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Estructuras de control: condiciones compuestas[]

A diferencia de instrucciones condicionales simples, las compuestas permiten llevar a cabo diferentes acciones en función de la condición. Por ejemplo, en lugar de mostrar protagonistas o secundarios, es posible mostrar ambos pero de diferentes forma. La siguiente transformación muestra entre paréntesis los nombres de los actores secundarios:

<?xml version="1.0" encoding="iso-8859-15"?>

<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">

<xsl:preserve-space elements="*"/>

<xsl:template match="/">
<html>

<head>
	<title>
		<xsl:value-of select="/pelicula/@titulo"/>
	</title>
</head>

<body>
	<b><xsl:value-of select="/pelicula/@titulo"/></b><br/>
	<u>Director</u>:<xsl:text> </xsl:text>
	<xsl:value-of select="/pelicula/direccion/director/@nombre"/>
	<xsl:text> </xsl:text>
	<xsl:value-of select="/pelicula/direccion/director/@apellidos"/><br/>
	<u>Intérpretes</u>:<br/>
	<xsl:for-each select="/pelicula/reparto/interprete">
		<xsl:choose>
			<xsl:when test="@papel = 'protagonista'">
				<xsl:value-of select="@nombre"/>
				<xsl:text> </xsl:text>
				<xsl:value-of select="@apellidos"/><br/>
			</xsl:when>
			<xsl:otherwise>
				(<i><xsl:value-of select="@nombre"/>
				<xsl:text> </xsl:text>
				<xsl:value-of select="@apellidos"/></i>)<br/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:for-each>
</body>

</html>
</xsl:template>
</xsl:stylesheet>

Formato[]

Para esta sección vamos a utilizar otro documento XML diferente:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="brazil.xsl"?>
<pelicula>
	<titulo>Brazil</titulo>
	<blu-ray>
		<euros>19.95</euros>
	</blu-ray>
</pelicula>

De él nos interesa el precio de la película. Vamos a modificar la forma en la que dicho dato se muestra:

<?xml version="1.0" encoding="iso-8859-15"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
<html>
<head>
	<title>
		<xsl:value-of select="/pelicula/titulo"/>
	</title>
</head>
<body>
	<b><xsl:value-of select="/pelicula/titulo"/></b><br/>
	Precio: <xsl:value-of select="/pelicula/blu-ray/euros"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Otra modificación más al respecto:

<?xml version="1.0" encoding="iso-8859-15"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:preserve-space elements="*"/>
<xsl:decimal-format
	name="european"
	decimal-separator=','
	grouping-separator='.'/>
<xsl:template match="/">
<html>
<head>
	<title>
		<xsl:value-of select="/pelicula/titulo"/>
	</title>
</head>
<body>
	<b><xsl:value-of select="/pelicula/titulo"/></b><br/>
	Precio:
	<xsl:value-of
	select="format-number(
		/pelicula/blu-ray/euros, '###.###,00', 'european')"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Ordenación[]

Vamos a terminar los ejemplos de este capítulo modificando el orden de los elementos de un documento XML. En este caso, mostraremos la lista de intérpretes de una película por órden alfabético ja. La siguiente transformación logra el objetivo:

<?xml version="1.0" encoding="iso-8859-15"?>
<xsl:stylesheet 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	version="1.0">
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
<html>
<head>
	<title>
		<xsl:value-of select="/pelicula/@titulo"/>
	</title>
</head>
<body>
	<b><xsl:value-of select="/pelicula/@titulo"/></b><br/>
	<u>Director</u>:<xsl:text> </xsl:text>
	<xsl:value-of
		select="/pelicula/direccion/director/@nombre"/>
	<xsl:text> </xsl:text>
	<xsl:value-of
		select="/pelicula/direccion/director/@apellidos"/>
	<br/>
	<u>Intérpretes</u>:<br/>
	<xsl:for-each select="/pelicula/reparto/interprete">
		<xsl:sort select="@apellidos"/>
		<xsl:value-of select="@apellidos"/>
		<xsl:text>, </xsl:text>
		<xsl:value-of select="@nombre"/><br/>
	</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Enlaces interesantes[]

Si deseas saber más sobre el formato XSL, está descrito en esta página.

Advertisement