XSL - generar xml a partir de dos xmls

 
Vista:

generar xml a partir de dos xmls

Publicado por Bego (1 intervención) el 22/10/2003 15:12:54
Hola, ¿alguien me podria decir donde encontrar un ejemplo en el que utilizando una xsl se genere un nuevo xml a partir de otros dos xmls?
Cuento un poco lo que quiero hacer: Tengo un xml que se generá cada dia con unos datos. Durante el dia se pueden añadir comentarios a los datos con lo que se añaden etiquetas a ese xml. Al dia siguiente se genera un xml nuevo con los datos actualizados pero que no tienen los comentarios. Lo que quiero hacer es ir leyendo el xml del dia y el del dia anterior y si en el del dia anterior tengo comentarios copiarlos y pegarlos en el xml del dia, que es el que utilizaré para mostrar los datos, y asi no perder los comentarios. Espero haberme explicado más o menos. Muchas gracias por vuestra 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

Generar un nuevo XML a partir de dos XMLs

Publicado por Alejandro (227 intervenciones) el 04/07/2023 23:55:06
Aquí tienes un ejemplo de cómo utilizar XSLT para generar un nuevo XML a partir de dos XMLs:

Supongamos que tienes dos archivos XML: `datos_dia_anterior.xml` y `datos_dia_actual.xml`. Quieres generar un nuevo XML que combine los datos de ambos y conserve los comentarios del día anterior. Puedes utilizar un XSLT para lograr esto.

XML: datos_dia_anterior.xml
1
2
3
4
5
6
7
8
9
10
<datos>
  <dato>
    <id>1</id>
    <valor>100</valor>
  </dato>
  <dato>
    <id>2</id>
    <valor>200</valor>
  </dato>
</datos>

XML: datos_dia_actual.xml
1
2
3
4
5
6
7
8
9
10
<datos>
  <dato>
    <id>1</id>
    <valor>150</valor>
  </dato>
  <dato>
    <id>2</id>
    <valor>250</valor>
  </dato>
</datos>

XSL: combinar_xmls.xsl
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
34
35
36
37
38
39
40
41
42
43
44
45
46
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Importar el archivo XML del día anterior -->
  <xsl:variable name="datos_dia_anterior" select="document('datos_dia_anterior.xml')"/>
 
  <!-- Plantilla de combinación de datos -->
  <xsl:template match="/">
    <datos>
      <!-- Iterar sobre los datos del día actual -->
      <xsl:for-each select="datos/dato">
        <xsl:variable name="id" select="id"/>
        <xsl:variable name="valor_actual" select="valor"/>
 
        <!-- Buscar el dato correspondiente en el XML del día anterior -->
        <xsl:variable name="dato_anterior" select="$datos_dia_anterior/datos/dato[id = $id]"/>
 
        <!-- Comprobar si hay un dato anterior con el mismo ID -->
        <xsl:choose>
          <!-- Si hay un dato anterior, utilizar su valor y copiar los comentarios -->
          <xsl:when test="$dato_anterior">
            <dato>
              <id>
                <xsl:value-of select="$id"/>
              </id>
              <valor>
                <xsl:value-of select="$valor_actual"/>
              </valor>
              <!-- Copiar los comentarios del dato anterior -->
              <xsl:copy-of select="$dato_anterior/comentario"/>
            </dato>
          </xsl:when>
          <!-- Si no hay un dato anterior, utilizar el valor actual -->
          <xsl:otherwise>
            <dato>
              <id>
                <xsl:value-of select="$id"/>
              </id>
              <valor>
                <xsl:value-of select="$valor_actual"/>
              </valor>
            </dato>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </datos>
  </xsl:template>
</xsl:stylesheet>

En este ejemplo, el archivo XSL combina los datos del día actual con los datos del día anterior. Utiliza la función `document()` para importar el archivo XML del día anterior dentro del XSL. Luego, itera sobre los datos del día actual y busca el dato correspondiente en el XML del día anterior utilizando el ID. Si encuentra un dato anterior con el mismo ID, utiliza su valor y copia los comentarios. Si no encuentra un dato anterior, utiliza el valor actual.

Al aplicar este XSL a los archivos XML , obtendrás un nuevo XML `datos_dia_actual.xml` combinado con los comentarios preservados:

Resultado: datos_combinados.xml
1
2
3
4
5
6
7
8
9
10
<datos>
  <dato>
    <id>1</id>
    <valor>150</valor>
  </dato>
  <dato>
    <id>2</id>
    <valor>250</valor>
  </dato>
</datos>

Puedes utilizar una herramienta XSLT para aplicar el XSL a tus archivos XML y generar el nuevo XML combinado. Algunas herramientas populares son XSLTProcessor para JavaScript, Xalan para Java y Saxon para diversas plataformas.

Espero que este ejemplo te sea útil para combinar tus archivos XML y conservar los comentarios.
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