Saltar al contenido principal

template

El elemento template es el bloque fundamental de una hoja XSL, el cual permite definir una plantilla que permitirá generar una salida conforme a lo definido en ella.

La estructura de este elemento es la siguiente:

<xsl:template match="expresion-xpath" name="nombre">
<!-- ... -->
</xsl:template>

Donde:

  • match se emplea para asociar una plantilla con un elemento XML. Este atributo también puede ser usado para definir una plantilla para el documento XML completo. El valor del atributo match será una expresión en XPath. Es un elemento obligatorio si no se define el atributo name.
  • name define un nombre para la plantilla. Este nombre se utiliza para invocar la plantilla con el elemento call-template.

Seleccionar el elemento raíz

Un uso muy común es utilizar el valor / en el atributo match. De esta forma, se selecciona el elemento raíz y se aplica el template a todo el documento XML:

hoja.xsl
<?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>Colección de música</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
</tr>
<tr>
<td>.</td>
<td>.</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

El el ejemplo anterior:

  • El elemento template define la plantilla.
  • El atributo match tiene como valor /, el cual representa la raíz del fichero XML.
  • El contenido del elemento template define el código HTML de salida que se procesará cuando se encuentre el nodo raíz (que es el que se ha seleccionado en el atributo match). Es decir, el nodo raíz será substituido por el contenido de la plantilla.

Consideremos que tenemos el siguiente documento XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="hoja.xsl"?>
<catalogo></catalogo>

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

<!DOCTYPE html>
<html>
<body>
<h2>Colección de música</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
</tr>
<tr>
<td>.</td>
<td>.</td>
</tr>
</table>
</body>
</html>

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

Probar en el navegador

Seleccionar un único elemento

Veamos qué ocurre cuando creamos un template que solo selecciona un elemento (de varios) de un documento XML. Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="direccion"></xsl:template>
</xsl:stylesheet>

Consideremos que tenemos el siguiente documento XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="508.xsl"?>
<agenda>
<persona id="p01">
<identificadores>
<nombre>Inés</nombre>
<apellidos>López Pérez</apellidos>
</identificadores>
<direccion>
<calle>El Ranchito 24, 6B</calle>
<localidad>Santander</localidad>
<cp>39006</cp>
</direccion>
<telefonos>
<movil>970123123</movil>
</telefonos>
</persona>
</agenda>

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




Inés
López Pérez



970123123



Podemos observar como solo se muestra el contenido del elemento identificadores y telefonos (con espacios en blanco). Estos se muestran porque no tienen ninguna plantilla asociada. Sin embargo, no ocurre lo mismo con direccion, la cual si que tiene una plantilla definida, aunque no tiene ningún elemento en su interior que permita dar formato al contenido del elemento. Es por eso que no se muestra ningún contenido.

Como se puede apreciar, si no existe ninguna plantilla a un elemento concreto, por defecto, se va a mostrar su contenido.

Probar en el navegador

Prioridad

Si tenemos varios template donde su selección uno de ellos contiene al otro, se tendrá en cuenta aquel template cuyo elemento seleccionado está más próximo al nodo raíz.

Por ejemplo, tenemos los siguientes template:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="cd">
<xsl:value-of select="titulo"/>
<xsl:value-of select="artista"/>
</xsl:template>
<xsl:template match="titulo">TÍTULO</xsl:template>
</xsl:stylesheet>

Consideremos 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>
</cd>
<cd>
<titulo>The Wall</titulo>
<artista>Pink Floyd</artista>
</cd>
<cd>
<titulo>Abbey Road</titulo>
<artista>The Beatles</artista>
</cd>
</catalogo>

En ese caso, la transformación XSLT daría como resultado el siguiente documento de texto:


ThrillerMichael Jackson
The WallPink Floyd
Abbey RoadThe Beatles

Como se puede observar, no se incluye el texto TÍTULO ya que prevalece el primer template: el elemento cd está más próximo a catalogo (elemento raíz) que titulo.

Probar en el navegador