Ich verwende XML, um eine kleine Kontaktliste zu speichern, und versuche, eine XSL-Vorlage zu schreiben, die sie in eine CSV-Datei umwandelt. Das Problem, das ich habe, ist mit Leerzeichen in der Ausgabe.
Das Ergebnis:
Friend, John, Smith, Home,
123 test,
Sebastopol,
California,
12345,
Home 1-800-123-4567, Personal john.smith@gmail.com
Ich habe sowohl die XML-Quelldatei als auch die zugehörige XSL-Vorlage eingerückt, um sie leichter lesen und entwickeln zu können, aber all der zusätzliche Leerraum wird in die Ausgabe übernommen. Die XML selbst hat keinen zusätzlichen Leerraum innerhalb der Knoten, nur außerhalb von ihnen für die Formatierung, und das gleiche gilt für die XSLT.
Damit die CSV-Datei gültig ist, muss jeder Eintrag in einer eigenen Zeile stehen und darf nicht unterbrochen sein. Neben dem Entfernen aller zusätzlichen Leerzeichen aus dem XML und XSLT (so dass sie nur eine lange Codezeile), gibt es einen anderen Weg, um loszuwerden, die Leerzeichen in der Ausgabe?
Bearbeiten: Hier ist ein kleines XML-Beispiel:
<PHONEBOOK>
<LISTING>
<FIRST>John</FIRST>
<LAST>Smith</LAST>
<ADDRESS TYPE="Home">
<STREET>123 test</STREET>
<CITY>Sebastopol</CITY>
<STATE>California</STATE>
<ZIP>12345</ZIP>
</ADDRESS>
<PHONE>1-800-123-4567</PHONE>
<EMAIL>john.smith@gmail.com</EMAIL>
<RELATION>Friend</RELATION>
</LISTING>
</PHONEBOOK>
Und hier ist die XSLT:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:for-each select="//LISTING">
<xsl:value-of select="RELATION" /><xsl:text>, </xsl:text>
<xsl:value-of select="FIRST" /><xsl:text>, </xsl:text>
<xsl:value-of select="LAST" /><xsl:text>, </xsl:text>
<xsl:if test="ADDRESS">
<xsl:for-each select="ADDRESS">
<xsl:choose>
<xsl:when test="@TYPE">
<xsl:value-of select="@TYPE" />,
</xsl:when>
<xsl:otherwise>
<xsl:text>Home </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="STREET" />,
<xsl:value-of select="CITY" />,
<xsl:value-of select="STATE" />,
<xsl:value-of select="ZIP" />,
</xsl:for-each>
</xsl:if>
<xsl:for-each select="PHONE">
<xsl:choose>
<xsl:when test="@TYPE">
<xsl:value-of select="@TYPE" />
</xsl:when>
<xsl:otherwise><xsl:text>Home </xsl:text></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="." /><xsl:text >, </xsl:text>
</xsl:for-each>
<xsl:if test="EMAIL">
<xsl:for-each select="EMAIL">
<xsl:choose>
<xsl:when test="@TYPE">
<xsl:value-of select="@TYPE" /><xsl:text > </xsl:text>
</xsl:when>
<xsl:otherwise><xsl:text >Personal </xsl:text></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="." /><xsl:text >, </xsl:text>
</xsl:for-each>
</xsl:if>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>