XSL - Como Iterar en un segundo XML a partir de XSL??

 
Vista:

Como Iterar en un segundo XML a partir de XSL??

Publicado por GabMx (4 intervenciones) el 18/12/2008 17:54:03
Hola amigos!

Me gustaría saber como puedo iterar sobre un segundo XML, tengo 2 archivos XML que estoy transformando a partir de un XSL para obtener un txt. Sin embargo, no encuentro la manera de realizar la iteración correcta.

Tengo lo siguiente:

terminal1.xml

<ResultedSet cant="3">
<title>premios</title>
<table>
<body>
<row>
<column>000260</column>
<column>55037511681208518</column>
<column>010319454652</column>
<column>999999</column>
<column>I99088</column>
<column>4213164015594541</column>
<column>27102008</column>
<column>080524</column>
<column>000492</column>
<column>M</column>
<column />
</row>
<row>
<column>000264</column>
<column>55032085764207218</column>
<column>021619313454</column>
<column>2000</column>
<column>I03441</column>
<column>4910891000658776</column>
<column>27102008</column>
<column>082852</column>
<column>005433</column>
<column>M</column>
<column />
</row>
<row>
<column>000272</column>
<column>55055290626205818</column>
<column>232526323646</column>
<column>1000</column>
<column>I18881</column>
<column>4910893041563544</column>
<column>27102008</column>
<column>085454</column>
<column>006150</column>
<column>R</column>
<column />
</row>
</body>
</table>
</ResultedSet>

terminal2.xml

<ResultedSet>
<title>SG</title>
<headline>
<item key="Fecha">29102008</item>
</headline>
<table>
<body>
<row>
<column>1</column>
<column>I99088</column>
<column>000260</column>
<column>55037511681208518</column>
<column>010405001</column>
<column>4213164015594541</column>
<column>30100004</column>
<column>010319454652</column>
<column>5</column>
<column>M</column>
<column>9</column>
</row>
<row>
<column>2</column>
<column>I03441</column>
<column>000264</column>
<column>55032085764207218</column>
<column>010405001</column>
<column>4910891000658776</column>
<column>30100008</column>
<column>021619313454</column>
<column>5</column>
<column>M</column>
<column>9</column>
</row>
<row>
<column>3</column>
<column>I18881</column>
<column>000272</column>
<column>55055290626205818</column>
<column>010405001</column>
<column>4910893041563544</column>
<column>30100015</column>
<column>232526323646</column>
<column>5</column>
<column>R</column>
<column>5</column>
</row>
</body>
</table>
</ResultedSet>

Y terminales.xsl

<xsl:template match="/ResultedSet">
<xsl:for-each select="table/body/row">
<xsl:text>TERMINAL-</xsl:text>
<xsl:value-of select="column[1]"/>
<xsl:value-of select="column[3]"/>
<xsl:value-of select="column[5]"/>

<xsl:if test="column[7]">
<xsl:variable name="boleto" select="document('terminal2.xml')" />
<xsl:for-each select="$boleto">
<xsl:value-of select="ResultedSet/table/body/row/column[7]"/>
</xsl:for-each>
</xsl:if>

<xsl:value-of select="column[10]"/>
<xsl:value-of select="column[9]"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>

Donde obtengo las columnas 1, 3, 5, 10 y 9 del terminal1.xml (archivo base) y del terminal2.xml trato de obtener los valores de la columna en la posición 7. Sin embargo, solo obtengo el valor de esta primera columna para los tres registros. Es decir:

TERMINAL-000260010319454652I9908830100004M000492
TERMINAL-000264021619313454I0344130100004M005433
TERMINAL-000272232526323646I1888130100004R006150

Cuando lo deseado es:

TERMINAL-000260010319454652I9908830100004M000492
TERMINAL-000264021619313454I0344130100008M005433
TERMINAL-000272232526323646I1888130100015R006150

De antemano, muchas gracias.
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

Iteración y combinación de datos de dos archivos XML

Publicado por Alejandro (227 intervenciones) el 06/07/2023 22:18:54
Para abordar la iteración y combinación de datos de dos archivos XML en tu transformación XSLT, hay algunos ajustes que puedes hacer en tu código para obtener los resultados deseados. A continuación, te proporciono una solución:

Archivo XSLT (terminales.xsl):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:template match="/ResultedSet">
    <xsl:for-each select="table/body/row">
      <xsl:text>TERMINAL-</xsl:text>
      <xsl:value-of select="column[1]"/>
      <xsl:value-of select="column[3]"/>
      <xsl:value-of select="column[5]"/>
 
      <xsl:variable name="pos" select="position()" />
      <xsl:variable name="boleto" select="document('terminal2.xml')" />
      <xsl:for-each select="$boleto/ResultedSet/table/body/row[$pos]">
        <xsl:value-of select="column[7]"/>
      </xsl:for-each>
 
      <xsl:value-of select="column[10]"/>
      <xsl:value-of select="column[9]"/>
      <xsl:text> </xsl:text>
    </xsl:for-each>
  </xsl:template>
 
</xsl:stylesheet>

En tu código original, estabas haciendo un bucle `xsl:for-each` para el archivo `terminal2.xml` dentro del bucle principal `xsl:for-each` para `table/body/row` del archivo `terminal1.xml`. Sin embargo, necesitas obtener los valores correspondientes de la columna en la posición 7 del archivo `terminal2.xml` para cada registro del archivo `terminal1.xml`.

En la solución proporcionada, agregué las siguientes modificaciones:

1. Añadí una variable `$pos` para almacenar la posición actual del bucle principal `xsl:for-each select="table/body/row"`.
2. Luego, utilicé esta variable para acceder a la fila correspondiente en el archivo `terminal2.xml` dentro del bucle secundario `xsl:for-each select="$boleto/ResultedSet/table/body/row[$pos]"`.
3. Dentro de ese bucle secundario, obtuve el valor de la columna en la posición 7 utilizando `column[7]`.

Con esta actualización, deberías obtener los valores de la columna en la posición 7 del archivo `terminal2.xml` para cada registro del archivo `terminal1.xml` correctamente.

Recuerda ajustar los nombres de los archivos XML y las rutas de acceso según tus necesidades y la ubicación real de los archivos XML.

Esta solución te permitirá iterar sobre ambos archivos XML y combinar los datos requeridos en tu transformación XSLT para obtener los resultados deseados.
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