XSL - Agrupar en xsl 1.0

 
Vista:

Agrupar en xsl 1.0

Publicado por Kiko (2 intervenciones) el 08/02/2006 11:28:42
Tengo el siguiente problema:

Tengo un xml, por ejemplo, de provincias:

<provincias>
<codigo>48</codigo>
<codigo>20</codigo>
<codigo>48</codigo>
<codigo>01</codigo>
<codigo>20</codigo>
<codigo>48</codigo>
<codigo>20</codigo>
<codigo>01</codigo>
</provincias>

El problema lo tengo porque quiero hacer lo siguiente:

Necesito hacer un bucle ordenado por "codigo", y comparar el codigo del registro actual del bucle con el del registro anterior dentro del bucle. Para ello, estoy intentando lo siguiente:

<xsl:for-each select="provincia/codigo">

<xsl:sort select="." />

<xsl:if test="position() = 1">
<xsl:value-of select="."/><br/>
</xsl:if>
<xsl:if test="position() != 1">
<xsl:variable name="intPosAnt" select="position()-1"/>
<xsl:variable name="provinciaant" select="../codigo[position()=$intPosAnt]"/>

ANTERIOR (<xsl:value-of select="$provinciaant"/>)<br/>
</xsl:if>

</xsl:for-each>

resulta que al intentar obtener el codigo del registro anterior mediante esta instruccion

<xsl:variable name="provinciaant" select="../codigo[position()=$intPosAnt]"/>

siempre hace referencia sobre el xml original y no sobre el xml ordenado del bucle. Asi que no puedo saber cuando cambio de provincia para dibujar su codigo.

¿existe alguna forma de saber cual es el codigo que ha pasado anteriormente por el bucle?
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
Imágen de perfil de Alejandro

Obtener el código de la provincia anterior en un bucle ordenado

Publicado por Alejandro (227 intervenciones) el 05/07/2023 20:16:46
El problema que estás enfrentando se debe a que estás intentando acceder al valor del código de la provincia anterior utilizando la ruta relativa "../codigo", que se refiere al contexto del XML original en lugar del bucle ordenado. Para obtener el código de la provincia anterior dentro del bucle ordenado, puedes utilizar la función `preceding-sibling::codigo[1]`. A continuación, te muestro cómo puedes ajustar tu código para lograrlo:

1
2
3
4
5
6
7
8
9
10
11
12
<xsl:for-each select="provincias/codigo">
  <xsl:sort select="."/>
 
  <xsl:if test="position() = 1">
    <xsl:value-of select="."/><br/>
  </xsl:if>
 
  <xsl:if test="position() != 1">
    <xsl:variable name="provinciaant" select="preceding-sibling::codigo[1]"/>
    ANTERIOR (<xsl:value-of select="$provinciaant"/>)<br/>
  </xsl:if>
</xsl:for-each>

En este ajuste, he reemplazado la expresión `../codigo[position()=$intPosAnt]` por `preceding-sibling::codigo[1]` en la declaración de la variable `$provinciaant`. La función `preceding-sibling::codigo[1]` selecciona el código del elemento `<codigo>` que es el primer "hermano anterior" dentro del bucle ordenado.

De esta manera, podrás obtener el código de la provincia anterior correctamente dentro del bucle ordenado y utilizarlo según sea necesario.

Espero que esta solución te sea útil para obtener el código de la provincia anterior en un bucle ordenado. ¡Buena suerte!
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

Obtener el código de la provincia anterior en un bucle ordenado

Publicado por Kiko (2 intervenciones) el 01/08/2023 13:09:12
Hola Alejandro, muchas gracias por tu respuesta. Imagino que al final resolvería el problema de alguna forma, ya que puse el mensaje hace 17 años, pero aún así se agradece tu aportación!!

Un saludo
Kiko
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