En algún sitio he visto que una transformación puede solucionar el asunto, por ejemplo aquí: transformación xml a cvs-
Añado la mía con unas explicaciones.
El fichero XML corresponde a una exportación a formato XML de la base de datos "The Bank Schema" del libro Learning SQL, by Alan Beaulieu. La tabla es la siguiente:
El fichero XML es:
<prueba>
<!-- Tabla officer -->
<officer>
<officer_id>1</officer_id>
<cust_id>10</cust_id>
<fname>John</fname>
<lname>Chilton</lname>
<title>President</title>
<start_date>1995-05-01</start_date>
</officer>
<officer>
<officer_id>2</officer_id>
<cust_id>11</cust_id>
<fname>Paul</fname>
<lname>Hardy</lname>
<title>President</title>
<start_date>2001-01-01</start_date>
</officer>
<officer>
<officer_id>3</officer_id>
<cust_id>12</cust_id>
<fname>Carl</fname>
<lname>Lutz</lname>
<title>President</title>
<start_date>2002-06-30</start_date>
</officer>
<officer>
<officer_id>4</officer_id>
<cust_id>13</cust_id>
<fname>Stanley</fname>
<lname>Cheswick</lname>
<title>President</title>
<start_date>1999-05-01</start_date>
</officer>
</prueba>
La transformación del fichero que contiene la tabla XML a otro fichero que contiene el texto CVS se consigue mediante una hoja de transformación XSLT que aquí transcribo.
<?xml version="1.0" encoding="UTF-8"?>
<!-- New document created with EditiX at Sun Mar 25 22:06:58 BST 2012 -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Elijo formato texto como salida -->
<xsl:output method="text"/>
<!-- Apunta el comienzo del árbol -->
<xsl:template match="prueba">
<!-- Seleccionará todas las filas de la tabla, o lo que es lo mismo todos los nodos officer del árbol -->
<xsl:apply-templates select="officer"/>
</xsl:template>
<!-- Apuntará a la primera fila de la tabla, o sea al primer nodo-->
<xsl:template match="officer">
<!-- bucle para recorrer todos hijos del nodo officer-->
<xsl:for-each select="*">
<!-- Instrucción para seleccionar sucesivamente el valor de cada uno de los nodos -->
<xsl:value-of select="."/>
<!-- Instrucción para no añadir una coma al leer el último nodo hijo de officer. -->
<xsl:if test="position() != last()">
<!-- Instrucción para añadir una coma a continuación de cada nodo hijo de officer -->
<xsl:value-of select="','"/>
</xsl:if>
</xsl:for-each>
<!-- Cuando termina de leer la fila añade un salto de página y continua con la siguiente hasta finalizar -->
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
El resultado es el siguiente:
1,10,John,Chilton,President,1995-05-01
2,11,Paul,Hardy,President,2001-01-01
3,12,Carl,Lutz,President,2002-06-30
4,13,Stanley,Cheswick,President,1999-05-01
2,11,Paul,Hardy,President,2001-01-01
3,12,Carl,Lutz,President,2002-06-30
4,13,Stanley,Cheswick,President,1999-05-01
No hay comentarios:
Publicar un comentario