XSL - Recorrer lista

 
Vista:

Recorrer lista

Publicado por Juan (1 intervención) el 25/03/2021 09:13:10
Hola a todos:

Estoy intentando resolver un ejercicio y estoy totalmente atascado. Tengo una lista en xml, tendrá unos 500 habitantes, y está montada así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE habitantes>
<habitantes
    <habitante dni="123456789F">
        <nombre>ANTONIO</nombre>
        <apellidos>SANCHEZ FUENTES</apellidos>
        <localidad>MADRID</localidad>
        <edad>20</edad>
</habitante>
<habitantes
    <habitante dni="123456789G">
        <nombre>MANUEL</nombre>
        <apellidos>ALVAREZ GARCIA </apellidos>
        <localidad>BARCELONA</localidad>
        <edad>20</edad>
    </habitante>
</habitantes>

El ejercicio es el siguiente: Todas las localidades separadas por comas (al final un punto), el número de habitantes que tiene cada una de ellas y su porcentaje respecto al total:
Formato: MADRID(Habitantes: 357, Porcentaje: 61.98%), BARCELONA(Habitantes: 19, Porcentaje: 3.30%), ... .

Pues bien, soy incapaz de lograr obtener el valor de i para cada ciudad para poder calcular su porcentaje y el número de habitantes dentro del for-each. He probado esto, pero no me cambia la variable de cada localidad:


1
2
3
4
5
6
7
8
9
<xsl:variable name="pueblo" select="habitantes/habitante/localidad"/>
<xsl:for-each select="habitantes/habitante">
    <xsl:if test="localidad = $pueblo">
        <xsl:value-of select="$pueblo"/>
        <xsl:text> (Habitantes:</xsl:text>
        <xsl:value-of select="count(habitantes/habitante/localidad[localidad = $pueblo])"/>
        <xsl:text> , Porcentaje:</xsl:text>
    </xsl:if>
</xsl:for-each>

Bueno, para ser honesto he probado multitud de opciones pero ninguna me da resultado. Por favor, alguien podría decirme como montar la sentencia? Gracias de antemano


Jose Juan
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 de habitantes y porcentajes por localidad

Publicado por Alejandro (227 intervenciones) el 07/07/2023 19:24:24
Para resolver el ejercicio y obtener el número de habitantes y el porcentaje por localidad, necesitarás utilizar técnicas de agrupación y sumarización en XSLT. Aquí tienes una posible solución:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
  <xsl:template match="/">
    <xsl:variable name="totalHabitantes" select="count(habitantes/habitante)"/>
    <xsl:variable name="porcentajeTotal" select="100 div $totalHabitantes"/>
 
    <xsl:text>Formato: </xsl:text>
    <xsl:for-each select="habitantes/habitante">
      <xsl:if test="position() &gt; 1">, </xsl:if>
      <xsl:value-of select="localidad"/>
      <xsl:text>(Habitantes: </xsl:text>
      <xsl:value-of select="count(../habitante[localidad = current()/localidad])"/>
      <xsl:text>, Porcentaje: </xsl:text>
      <xsl:value-of select="format-number((count(../habitante[localidad = current()/localidad]) * $porcentajeTotal), '0.00')"/>
      <xsl:text>%)</xsl:text>
    </xsl:for-each>
    <xsl:text>. </xsl:text>
  </xsl:template>
 
</xsl:stylesheet>

En esta solución, se utiliza la variable `$totalHabitantes` para obtener el número total de habitantes y la variable `$porcentajeTotal` para calcular el porcentaje base que se aplicará a cada localidad.

Dentro del `for-each`, se compara la localidad actual con todas las localidades en el contexto para obtener el recuento de habitantes por localidad. Luego se calcula el porcentaje multiplicando el recuento de habitantes por el `$porcentajeTotal`.

Recuerda que esta solución asume que estás aplicando el XSLT al XML proporcionado correctamente estructurado. Asegúrate de que el archivo XML incluya la etiqueta de cierre `</habitantes>` para que sea válido.

¡Buena suerte con tus ejercicios!
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