XSL - Calcular un máximo en xsl

 
Vista:

Calcular un máximo en xsl

Publicado por Felipe (2 intervenciones) el 12/01/2006 17:28:23
Buenas.
Estoy intentando hacer una cosa, a ver si a os se te ocurre algo.
Consiste en clacular un máximo en XSL pero no soy capaz de hacerlo.
Viene a ser esto:
______________________________________________________________
<!--En esta variable quiero guardar el maximo-->
<xsl:variable name="maximo" select="0"/>

<!--Variable auxiliar-->
<xsl:variable name="tmp" select="0"/>

<!--Quiero contar el numero macimo de key que aparecen en comand-->

<xsl:for-each select="comand">
<!--Incializar tmp a 0--> <xsl:for-each select="key">
<!--tmp++-->
<xsl:for-each>
<xsl:if test="tmp>maximo">
<!--maximo = $tmp-->
</xsl:fin>
</xsl-for-each>
_______________________________________________________________
Como podeis ver no soy capaz de modificar valores de variables, como puedo hacerlo?.
En caso de que no se pueda hacer así, se os ocurre alguna forma de hacerlo?
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

Cálculo del máximo utilizando recursión en XSLT 1.0

Publicado por Alejandro (227 intervenciones) el 05/07/2023 19:55:00
Buenas, Felipe.

En XSLT 1.0, las variables son inmutables una vez que se les asigna un valor. No puedes modificar directamente el valor de una variable una vez que se ha establecido. Sin embargo, puedes usar una técnica llamada "recursión" para lograr el cálculo del máximo en XSLT 1.0.

Aquí tienes una posible solución utilizando la recursión:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:variable name="maximo">
      <xsl:call-template name="calcularMaximo">
        <xsl:with-param name="comands" select="comands/comand"/>
      </xsl:call-template>
    </xsl:variable>
    <!-- Utiliza $maximo donde lo necesites -->
    <xsl:value-of select="$maximo"/>
  </xsl:template>
 
  <!-- Plantilla para calcular el máximo -->
  <xsl:template name="calcularMaximo">
    <xsl:param name="comands"/>
    <xsl:param name="max" select="0"/>
 
    <xsl:choose>
      <!-- Caso base: no hay más comands -->
      <xsl:when test="not($comands)">
        <xsl:value-of select="$max"/>
      </xsl:when>
      <xsl:otherwise>
        <!-- Calcula el máximo actual -->
        <xsl:variable name="currentMax" select="count($comands[1]/key)"/>
        <!-- Llama a la plantilla recursivamente con el resto de los comands -->
        <xsl:call-template name="calcularMaximo">
          <xsl:with-param name="comands" select="$comands[position() &gt; 1]"/>
          <xsl:with-param name="max" select="max($max, $currentMax)"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

En este código, utilizamos una plantilla llamada "calcularMaximo" que toma dos parámetros: "comands" (los elementos `<comand>`) y "max" (el máximo actual). La plantilla se llama recursivamente pasando el resto de los comands y el nuevo máximo si se encuentra un valor mayor.

Espero que esta solución te sea útil para calcular el máximo en XSLT 1.0. ¡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