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 elementoscd
.
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: