Saltar al contenido principal

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.

Probar en el navegador

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.