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