XSL - Duda XSLT

 
Vista:

Duda XSLT

Publicado por carlos (1 intervención) el 02/12/2010 15:18:19
Buenas tardes.

Tengo una dudilla con XSLT. Os pongo un ejemplo.

Si tengo lo siguiente:

<Alumnos>
<Alumno1>
<nombre>Jorge Esteban Crist</nombre>
<edad>24</edad>
</Alumno1>
.....
<Alumno24>
<nombre>Jorge Esteban Crist</nombre>
<lugarNacimiento>Zaragoza</lugarNacimiento>
</Alumno24>
</Alumnos>

Al recorrer todo un documento XML se detecta que hay dos etiquetas que corresponden al mismo alumno, por lo que en mi documento de salida quiero que esté todo junto en una misma etiqueta, es decir:

<Alumnos>
<Alumno1>
<nombre>Jorge Esteban Crist</nombre>
<edad>24</edad>
<lugarNacimiento>Zaragoza</lugarNacimiento>
</Alumno1>
</Alumnos>

Quiero juntar toda la información para un mismo individuo. Aquí está mi duda...No sé cómo hacer para que únicamente sea uno con toda la información correspondiente.

¿Alguien sabe qué función hay que utilizar de XSLT para realizar lo anterior?

Un saludo y muchas gracias de antemano!
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

Fusionar etiquetas de un mismo individuo en XSLT

Publicado por Alejandro (227 intervenciones) el 07/07/2023 00:23:32
La solución para fusionar las etiquetas de un mismo individuo en XSLT implica el uso de la función `group-by` y la plantilla `for-each-group`. Aquí tienes un ejemplo de cómo lograrlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
 
  <xsl:template match="Alumnos">
    <xsl:copy>
      <xsl:for-each-group select="*" group-by="nombre">
        <xsl:copy>
          <xsl:apply-templates select="node()"/>
          <xsl:apply-templates select="current-group()[position() &gt; 1]/node()"/>
        </xsl:copy>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
 
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
 
</xsl:stylesheet>

En este código XSLT, se utiliza la plantilla principal para seleccionar el elemento `Alumnos` como punto de partida. Luego, se utiliza la función `group-by` en la expresión `for-each-group` para agrupar los elementos según el valor de la etiqueta `nombre`.

Dentro del bucle `for-each-group`, se crea una copia del elemento `Alumno` para cada grupo y se aplican las plantillas correspondientes para copiar los nodos hijos de cada elemento. Se utilizan dos aplicaciones de plantillas: una para los nodos del primer elemento del grupo (`<xsl:apply-templates select="node()"/>`) y otra para los nodos de los elementos adicionales del mismo grupo (`<xsl:apply-templates select="current-group()[position() &gt; 1]/node()"/>`).

Finalmente, se aplica la plantilla `match="@* | node()"` para copiar todos los atributos y nodos restantes sin cambios.

Con esta solución, las etiquetas de un mismo individuo se fusionarán en una única etiqueta en el resultado del XML transformado.

Recuerda que este es solo un ejemplo y puedes ajustarlo según la estructura específica de tu XML. Además, ten en cuenta que la compatibilidad y las funciones exactas pueden variar según el procesador XSLT que estés utilizando.
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