J'utilise XML pour stocker une petite liste de contacts et j'essaie d'écrire un modèle XSL qui la transformera en un fichier CSV. Le problème que je rencontre concerne les espaces dans le fichier de sortie.
Le résultat :
Friend, John, Smith, Home,
123 test,
Sebastopol,
California,
12345,
Home 1-800-123-4567, Personal john.smith@gmail.com
J'ai indenté/espacé le fichier XML source et le modèle XSL associé pour en faciliter la lecture et le développement, mais tous ces espaces blancs supplémentaires se retrouvent dans le résultat. Le XML lui-même n'a pas d'espace blanc supplémentaire à l'intérieur des nœuds, juste à l'extérieur pour le formatage, et il en va de même pour le XSLT.
Pour que le fichier CSV soit valide, chaque entrée doit être sur sa propre ligne, sans être interrompue. Outre la suppression de tout espace blanc supplémentaire dans le XML et le XSLT (ce qui en fait une seule longue ligne de code), existe-t-il un autre moyen de se débarrasser des espaces blancs dans la sortie ?
Edit : Voici un petit échantillon XML :
<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>
Et voici le 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>
4 votes
Pourquoi utilisez-vous
disable-output-escaping
sur chaque<xsl:text>
? Vous n'avez pas besoin de cela pour<xsl:output method='text'>
. Extrait de la spécification XSLT 1.0 : "La méthode de sortie du texte ignore l'attribut disable-output-escaping, puisqu'elle n'effectue aucun échappement en sortie."