XSL - Almacenar nodos en for-each

   
Vista:

Almacenar nodos en for-each

Publicado por Jose (1 intervención) el 04/11/2008 12:55:09
Hola,

tengo un xml que tiene el siguiente aspecto:

<?xml version="1.0" encoding="UTF-8"?>
<cmanager>
<cm>
<mensaje>TELEPROCESO. Arranque IDMSV1</mensaje>
<respuesta>28-8-2008 06:57</respuesta>
</cm>
<cm>
<mensaje>TELEPROCESO. Parada IDMSV1</mensaje>
<respuesta>28-8-2008 23:01</respuesta>
</cm>
.
.
.
</cmanager>

y al que quiero aplicar una plantilla xsl para generar una página html.
El caso es que, para el caso concreto del xml de arriba, necesito poner los valores de "respuesta" en la misma fila de una tabla, algo del tipo:

------------------------------------------------------------------
| 28-8-2008 06:57 | 28-8-2008 23:01 |
------------------------------------------------------------------

pero al recorrer el xml con un <xsl:for-each select="cm">, cuando estoy en el nodo de la primera respuesta, no se si puedo o es posible acceder al nodo siguiente y recuperar la siguiente respuesta y cuando estoy en el segundo pues lo mismo.

He intentado almacenar el primer valor en un tag <xsl:variable />, pero cuando trato de acceder al valor en la siguiente iteración, me dice que la variable no esta declarada, vamos, que se queda fuera de ámbito.

También he intentado con dos xsl:if, que cuando llegue al primer nodo devuelva la primera parte de la fila:

<xsl:if test="mensaje = 'TELEPROCESO. Arranque IDMSV1'">
<tr>
<td width="20%" align="left">IDMSV1</td>
<td width="20%" align="left"><xsl:value-of select="respuesta" /></td>
</xsl:if>

y cuando llegue al segundo nodo, devuelva la segunda:

<xsl:if test="mensaje = 'TELEPROCESO. Parada IDMSV1'">
<td width="20%" align="left"><xsl:value-of select="respuesta[last()]" /></td>
<td width="20%" align="center">Tareas Procesadas</td>
<td width="20%" align="center">Tareas Canceladas</td>
</tr>
</xsl:if>

pero en este caso el navegador me dice que el tag tr no tiene su correspondiente tr de cierre y también falla.

¿Hay alguna forma de bypasear lo del tr, de recuperar el valor de respuesta del siguiente nodo o de almacenar el valor de la primera respuesta de manera que pueda recuperarlo en la siguiente iteración del for-each?.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Almacenar nodos en for-each

Publicado por Mukuykak (8 intervenciones) el 06/11/2008 04:36:23
Saludos, José.

Para tu problema concreto, la respuesta es la siguiente:

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

<html>
<head><title>CMANAGER</title></head>

<body>
<table border="2" bordercolor="blue" cellspacing="2" cellpadding="5">
<tr><xsl:apply-templates select="cm" /></tr>
</table>
</body>

</html>

</xsl:template>

<xsl:template match="cm">
<xsl:for-each select=".">
<td><xsl:value-of select="respuesta" /></td>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Como verás en el ejemplo, en el template "cm", el <xsl:for-each> buscará en cada nodo "cm" y creará una nueva celda con el valor del nodo "respuesta" que halle en cada "cm".
El template se llama "cm", porque debe coincidir con el nombre del nodo padre que contenga a los nodos hijo "respuesta" y "mensaje".
Si deseas ampliar tu xsl para visualizar el texto de cada nodo "mensaje", tendrás qué crear un nuevo template "cm", pero con un nuevo atributo: "mode".
Ejem:

<xsl:template match="cm" mode="valor_cualquiera">
<xsl:for-each select=".">
<td><xsl:value-of select="mensaje" /></td>
</xsl:for-each>
</xsl:template>

Y para invocarlo en el template raíz, usarías:
<xsl:apply-templates select="cm" mode="valor_cualquiera" />

Como un consejo: sería mejor que usaras el encoding "iso-8859-1", porque si usaras por accidente un acento o la letra "ñ", el utf-8 te mandaría mensaje de error en tu xml, ya que está diseñado para el idioma inglés.

Espero que te sea comprensible el ejemplo; cualquier duda, postéala.
Buen día.
=0)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar