domingo, 25 de marzo de 2012

Convertir un documento XML a formato CVS

Mysql no da facilidades para la importación de documento en formato XML. Todo pasa por interminables sesiones de PHP de lo más raras. No termino de quedarme con el asunto de las librerías y todas esas cuestiones. Tampoco he logrado importar ningún documento XML a una base de datos. No hay manera. Siempre da error, si no es por una cuestión es por otra. Buscar en internet sobre este asunto es oír cientos de llamadas desesperadas de actuantes que quieren pasar un documento XML a una tabla MYSQL. Interminables listas de foros donde está la pregunta pero no aparece la respuesta. Eso y la publicidad que todo lo llena. Una pérdida de tiempo.
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

No hay comentarios:

Publicar un comentario