XSL - xml+xsl -> csv

 
Vista:

xml+xsl -> csv

Publicado por Irati (1 intervención) el 12/05/2010 11:22:40
Hola a todos,
Con el titulo que he puesto creo que queda bastante claro lo que estoy intentando hacer, la cuestión es que tengo un documento .xml bastante complejo en el que alguno de los parámetros aparece definido de la siguiente forma:

<transition xmi:id="JUGdIE3pEd" name="trans 1" source="TyxbMFNqEd" target="DtA40E3pEd" />

El problema que tengo es que estoy escribiendo el archivo .xsl para obtener unos datos del .xml y ponerlos en formato .csv, ya que no he encontrado ninguna manera automática de hacer esto… Lo que quiero es copiar el dato "name" en el .csv, pero antes de copiarlo quiero comprobar si ya he copiado otra 'transición' con el mismo nombre, y si es así que no lo copie.

Por ejemplo si tengo:

<transition xmi:id="JUGdIE3pEd" name="trans 1" source="TyxbMFNqEd" target="DtA40E3pEd" />
<transition xmi:id="JUGdIE3pEd" name="trans 2" source="TyxbMFNqEd" target="DtA40E3pEd" />
<transition xmi:id="JUGdIE3pEd" name="trans 1" source="TyxbMFNqEd" target="DtA40E3pEd" />
<transition xmi:id="JUGdIE3pEd" name="trans 3" source="TyxbMFNqEd" target="DtA40E3pEd" />

Querría:

trans 1, trans2, trans 3

Gracias por la 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

Copiar y filtrar datos de un archivo XML a formato CSV

Publicado por Alejandro (227 intervenciones) el 07/07/2023 00:12:05
La solución para copiar y filtrar los datos del archivo XML en formato CSV, verificando si ya se ha copiado una transición con el mismo nombre, implica el uso de variables y la función `xsl:key` en XSLT. Aquí tienes un ejemplo de cómo puedes lograrlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- Definir una clave para agrupar las transiciones por el nombre -->
<xsl:key name="transiciones" match="transition" use="@name" />
 
<!-- Plantilla para seleccionar y copiar las transiciones únicas -->
<xsl:template match="/">
  <xsl:variable name="transicionesUnicas" select="//*[generate-id() = generate-id(key('transiciones', @name)[1])]" />
  <xsl:text>Nombre de transición&#xA;</xsl:text> <!-- Encabezado del CSV -->
  <!-- Iterar sobre las transiciones únicas y copiar el nombre -->
  <xsl:for-each select="$transicionesUnicas">
    <xsl:value-of select="@name" />
    <xsl:text>&#xA;</xsl:text> <!-- Nueva línea en el CSV -->
  </xsl:for-each>
</xsl:template>

En este código, se define una clave llamada "transiciones" utilizando `xsl:key` para agrupar las transiciones por el atributo `@name`. Luego, se utiliza una variable llamada "transicionesUnicas" para seleccionar y almacenar las transiciones únicas utilizando la función `generate-id()` y `key()`. Esto permite filtrar las transiciones duplicadas por el nombre.

Dentro de la plantilla principal (`<xsl:template match="/">`), se itera sobre las transiciones únicas y se copia el valor del atributo `@name` en el formato del CSV. Se agrega un encabezado al CSV con el texto "Nombre de transición" y se agrega una nueva línea después de cada nombre de transición.

Con esta solución, se copiarán los nombres de las transiciones únicas en el formato CSV, evitando duplicados.

Recuerda que este es solo un ejemplo y puedes ajustarlo según tus necesidades específicas y la estructura de tu archivo XML. Además, ten en cuenta que la solución está basada en XSLT y puede requerir ajustes adicionales 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