lundi 2 novembre 2009

XSL transformation - XML to CSV

Issu d'un article en allemand (dont j'ai perdu la trace), voici une méthode permettant de transformer du contenu XML en CSV par l'intermédiaire d'une stylesheet relativement simple.

Les données

<?xml version="1.0"?>
<daten>
<!-- test.xml Testdatei zum umformen nach csv mit xmltocsv -->
<name id="idausnamen" aber="keine Attribute">
    <name>1. Thomas</name>
    <wert-zwei>1b.</wert-zwei>
</name>
<ergebnis id="1">
    <wert>2.</wert>
    <nachname>Wenzlaff</nachname>
    <testtag>der 3. Tag</testtag>
</ergebnis>
<ergebnis id="2">
    <wert>3.</wert>
    <wert-drei>3b.</wert-drei>
</ergebnis>
<ergebnis id="3" aber="keine Attribute 22">
    <wert>4.</wert>
    <wert-drei>5.</wert-drei>
</ergebnis>
<ergebnis id="4">
    <wert>6.</wert>
</ergebnis>
</daten>

La stylesheet XSL
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />
<xsl:template match="/*/child::*">
<xsl:for-each select="child::*">
<xsl:if test="position() != last()">"<xsl:value-of select="normalize-space(.)"/>",</xsl:if>

<xsl:if test="position()  = last()">"<xsl:value-of select="normalize-space(.)"/>"<xsl:text>&#xD;</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Le résultat
"1. Thomas","1b."
"2.","Wenzlaff","der 3. Tag"
"3.","3b."
"4.","5."
"6."

Autre stylesheet

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />
<xsl:template match="/*/child::*">
<xsl:for-each select="child::*">
<xsl:if test="position() != last()"><xsl:value-of select="normalize-space(.)"/>;</xsl:if>
<xsl:if test="position() = last()"><xsl:value-of select="normalize-space(.)"/>;</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

avec cette fois le resultat:

1. Thomas;1b.;2.;Wenzlaff;der 3. Tag;3.;3b.;4.;5.;6.;

Aucun commentaire: