XSL - Agrupar y contar en XSL

 
Vista:

Agrupar y contar en XSL

Publicado por Pedro (1 intervención) el 16/01/2008 14:47:37
tengo un xml de la siguiente forma
<item>
<version>
<status>
Quiero hacer un xsl q me los agrupe por versión y status y me indique el total. Es decir.
<item>
<version>avc</version>
<status>abierto</status>
<item>
</item>
<version>avc</version>
<status>cerrado</status>
</item>
<item>
<version>png</version>
<status>cerrado</status>
<item>
</item>
<version>png</version>
<status>cerrado</status>
</item>

Quiero q me salga : Versión estado total
avc abierto 1
avc cerrado 1
png cerrado 2

El problema, es que los estados sin son fijos, pero la versión se le puede añadir al cabo del tiempo. 1º ordeno por versión para tenerlos agrupados y despues tengo que hacer dicho

Arriba dejo el xsl tal y como lo tengo, como pueden ver... ordena pero no agrupa... alguna ayuda???
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

Agrupar elementos por versión y estado y mostrar el total

Publicado por Alejandro (227 intervenciones) el 06/07/2023 18:47:35
Aquí tienes una solución utilizando XSLT 1.0 para agrupar los elementos por versión y estado, y mostrar el total correspondiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<xsl:key name="version-status" match="item" use="concat(version, '|', status)" />
 
<xsl:template match="/">
  <xsl:for-each select="item[generate-id() = generate-id(key('version-status', concat(version, '|', status))[1])]">
    <xsl:sort select="version" />
    <xsl:sort select="status" />
 
    <xsl:variable name="current-version" select="version" />
    <xsl:variable name="current-status" select="status" />
    <xsl:variable name="group-items" select="key('version-status', concat(version, '|', status))" />
 
    <xsl:value-of select="$current-version" /> <!-- Versión -->
    <xsl:text> </xsl:text>
    <xsl:value-of select="$current-status" /> <!-- Estado -->
    <xsl:text> </xsl:text>
    <xsl:value-of select="count($group-items)" /> <!-- Total -->
    <xsl:text>&#10;</xsl:text> <!-- Nueva línea -->
  </xsl:for-each>
</xsl:template>

En este ejemplo, utilizamos la función `key()` para agrupar los elementos `<item>` por la concatenación de la versión y el estado. Luego, utilizamos la función `generate-id()` y el uso de `<xsl:for-each>` para iterar sobre los elementos únicos de esa combinación.

Dentro del bucle, ordenamos los elementos por versión y estado y almacenamos la versión actual y el estado actual en variables. Utilizamos la función `count()` junto con la variable `$group-items` para obtener el total de elementos en ese grupo.

Finalmente, mostramos la versión, el estado y el total correspondiente para cada grupo.

Recuerda adaptar este código a tu estructura XML y asegurarte de que la ruta de acceso y las condiciones de selección sean correctas para tus datos.

Espero que esta solución te ayude a agrupar los elementos por versión y estado y mostrar el total correspondiente.
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