FANDOM



<?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-1.2.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. Es el caso del siguiente documento XML:

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

El documento XSL al que hace referencia el anterior XML es éste:

<?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 complejoEditar

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" encoding="iso-8859-15"?>
<pelicula titulo="Brazil" estreno="1985" minutos="142">
  <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 sencillaEditar

Fíjate en este documento XML:

<?xml version="1.0" encoding="iso-8859-15"?>
<?xml-stylesheet type="text/xsl" href="brazil-3.1.xsl"?>
<pelicula titulo="Brazil" estreno="1985" minutos="142">
  <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 elementosEditar

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" encoding="iso-8859-15"?>
<?xml-stylesheet type="text/xsl" href="brazil-4.1.xsl"?>
<pelicula titulo="Brazil" estreno="1985" minutos="142">
  <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" encoding="iso-8859-15"?>
<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: iteracionesEditar

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 simplesEditar

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 compuestasEditar

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>

FormatoEditar

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

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="brazil-8.1.xsl"?>
<pelicula>
  <titulo>Brazil</titulo>
  <dvd>
    <euros>19.95</euros>
  </dvd>
</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: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/dvd/euros, '###.###,00', 'european')"/>
</body>

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

OrdenaciónEditar

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 interesantesEditar

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