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 atributomatch
será una expresión en XPath. Es un elemento obligatorio si no se define el atributoname
.name
define un nombre para la plantilla. Este nombre se utiliza para invocar la plantilla con el elementocall-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:
<?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 atributomatch
). 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:
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.
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
.