XSL - Agrupar en XSL 1.0

 
Vista:

Agrupar en XSL 1.0

Publicado por Tano (1 intervención) el 09/02/2010 13:24:58
Hola.
Con una consulta a base de datos obtengo un archivo xml el cual, entre otras cosas, contiene:

<contrato num="con1">

<incidencia num_in="in1">
</incidencia>

</contrato>
<contrato num="con1">

<incidencia num_in="in2">
</incidencia>

</contrato>
<contrato num="con2">

<incidencia num_in="in1">
</incidencia>

</contrato>

...por ejemplo.

Este archivo lo formateo mediante XSL 1.0.
El caso es que necesito agrupar por contratos para que se muestre algo como esto:

Contrato con1
Incidencia in1
Incidencia in2

Contrato con2
Incidencia in1

Si declaro un template asi

<xsl:template match="Contrato" mode="group" >
<fieldset><legend>Contrato : <xsl:value-of select="@numero"/></legend>
<table>
.....
</table>
</fieldset>
</xsl:template>

Y luego lo aplico con <xsl:apply-templates select="modificacionContrato"/> los datos me aparecen sin el formato (fieldset, table....) antes especificado.

¿Cómo puedo hacer para que XSL me agrupe usando ese template declarado?
Muchas gracias y un saludo.
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 y formatear datos en base a un campo específico

Publicado por Alejandro (227 intervenciones) el 07/07/2023 00:04:19
La solución para agrupar y formatear los datos en base al campo "Contrato" utilizando el template declarado consiste en utilizar el concepto de Muenchian Grouping en XSLT 1.0. Aquí está el código modificado para lograrlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<xsl:key name="contratoKey" match="contrato" use="@num" />
 
<xsl:template match="/">
  <xsl:for-each select="contrato[generate-id() = generate-id(key('contratoKey', @num)[1])]">
    <xsl:apply-templates select="key('contratoKey', @num)" mode="group" />
  </xsl:for-each>
</xsl:template>
 
<xsl:template match="contrato" mode="group">
  <fieldset>
    <legend>Contrato : <xsl:value-of select="@num" /></legend>
    <table>
      <!-- Código para mostrar las incidencias -->
    </table>
  </fieldset>
</xsl:template>

En este código, se utiliza la función `key()` para definir una clave llamada "contratoKey" que se basa en el atributo `@num` del elemento `<contrato>`. Luego, se utiliza la expresión `contrato[generate-id() = generate-id(key('contratoKey', @num)[1])]` para seleccionar los elementos `<contrato>` únicos.

Dentro del template principal (`<xsl:template match="/">`), se utiliza un `<xsl:for-each>` para iterar sobre los contratos únicos y luego se aplica el template con `xsl:apply-templates` utilizando el modo "group".

Dentro del template con `mode="group"`, se muestra el formato deseado, como el `<fieldset>` y la `<table>`. Puedes agregar el código necesario para mostrar las incidencias dentro de la tabla.

Con esta solución, se agruparán los contratos y se aplicará el formato especificado para cada grupo.

Recuerda que esta solución utiliza el concepto de Muenchian Grouping en XSLT 1.0, que es una técnica comúnmente utilizada para agrupar y formatear datos en base a un campo específico. Puedes adaptar y ajustar este código según tus necesidades específicas.
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