value-of
El elemento value-of
es utilizado para extraer el valor de un elemento XML y añadirlo como salida a la hora de realizar la transformación.
La estructura de este elemento es la siguiente:
<xsl:value-of select="expresion-xpath" />
Donde:
select
es un atributo que recibe una expresión XPath del elemento que se desea mostrar.
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>Colección de música</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
</tr>
<tr>
<td>
<xsl:value-of select="catalogo/cd/titulo" />
</td>
<td>
<xsl:value-of select="catalogo/cd/artista" />
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
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>
</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 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>Thriller</td>
<td>Michael Jackson</td>
</tr>
</table>
</body>
</html>
El documento HTML se visualizaría de la siguiente manera:
Como se puede apreciar, solo se muestra la primera ocurrencia de catalogo/cd/titulo
y de catalogo/cd/artista
.
Contexto de la selección
Cuando se realiza una selección con el atributo match
de template
, el contexto actual es el del elemento seleccionado.
Consideremos el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="hoja.xsl"?>
<agenda>
<persona id="p01">
<datos>
<nombre>Inés</nombre>
<apellidos>López Pérez</apellidos>
</datos>
</persona>
<persona id="p02">
<datos>
<nombre>Roberto</nombre>
<apellidos>Gutiérrez Gómez</apellidos>
</datos>
</persona>
</agenda>
Consideremos, ahora, la siguiente hoja XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" />
<xsl:template match="persona">
<xsl:value-of select="datos/apellidos"/>, <xsl:value-of select="datos/nombre"/>
</xsl:template>
</xsl:stylesheet>
En ese caso, la transformación XSLT daría como resultado el siguiente documento de texto:
López Pérez, Inés
Gutiérrez Gómez, Roberto
Cuando se utiliza match="persona"
, las dos coincidencias que se encuentran son:
<persona id="p01">
<datos>
<nombre>Inés</nombre>
<apellidos>López Pérez</apellidos>
</datos>
</persona>
<persona id="p02">
<datos>
<nombre>Roberto</nombre>
<apellidos>Gutiérrez Gómez</apellidos>
</datos>
</persona>
En ambos casos, el contexto actual es persona
y, por lo tanto, si utilizamos una expresión XPath relativa en el atributo select
de value-of
, esta considerará que el contexto actual es persona
. Es por ello que se debe utilizar datos/nombre
para obtener el nombre de cada persona.