Saltar al contenido principal

apply-templates

El elemento apply-templates selecciona un conjunto de nodos del documento XML origen y le aplica un template.

La estructura de este elemento es la siguiente:

<xsl:apply-templates select="expresion-xpath" />

Donde:

  • select permite especificar los nodos que deben ser procesados utilizando una expresión XPath. Mediante un asterisco (*), se seleccionan todos los nodos. Si el atributo no se define, se seleccionan todos los nodos hijo del nodo actual.

Podemos especificar el orden en el que van a ser procesados los nodos mediante el elemento sort. Si no lo hacemos de este modo, se aplicarán en el orden utilizado por el intérprete al leer el documento XML, es decir, de arriba hacia abajo.

<xsl:apply-templates select="expresion-xpath">
<xsl:sort select="elemento">
</xsl:apply-templates>

Un ejemplo completo sería el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Catálogo de CDs</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
<th>Precio</th>
</tr>
<xsl:apply-templates select="catalogo/cd"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<tr>
<td><xsl:value-of select="titulo"/></td>
<td><xsl:value-of select="artista"/></td>
<td><xsl:value-of select="precio"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>

En este caso, podemos ver dos elementos template:

  • Uno que tiene como match la raíz.
  • Otro que tiene como match los elementos cd.

Por lo tanto, el documento final tendrá como base el código contenido dentro del primer template y los elementos cd se mostrarán formateados conforme al segundo template.

Si no se utiliza el elemento apply-templates, solo se mostraría el código del primer template ya que el primero contiene el segundo.

Consideremos que tenemos el siguiente documento XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="hoja.xsl"?>
<catalogo>
<cd>
<titulo>Thriller</titulo>
<artista>Michael Jackson</artista>
<precio>12.99</precio>
</cd>
<cd>
<titulo>The Wall</titulo>
<artista>Pink Floyd</artista>
<precio>9.99</precio>
</cd>
<cd>
<titulo>Abbey Road</titulo>
<artista>The Beatles</artista>
<precio>14.99</precio>
</cd>
</catalogo>

En ese caso, la transformación XSLT daría como resultado un documento HTML:

<!DOCTYPE html>
<html>
<body>
<h2>Catálogo de CDs</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
<th>Precio</th>
</tr>
<tr>
<td>Thriller</td>
<td>Michael Jackson</td>
<td>12.99</td>
</tr>
<tr>
<td>The Wall</td>
<td>Pink Floyd</td>
<td>9.99</td>
</tr>
<tr>
<td>Abbey Road</td>
<td>The Beatles</td>
<td>14.99</td>
</tr>
</table>
</body>
</html>

El documento HTML se visualizaría de la siguiente manera:

Probar en el navegador