53 votes

XSLT - supprimer les espaces dans les modèles

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>&#10;&#13;</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."

1voto

Pavel Minaev Points 60647

D'autres ont déjà signalé le problème général. Celui spécifique à votre feuille de style est que vous avez oublié <xsl:text> pour les virgules :

   <xsl:choose>
    <xsl:when test="@TYPE">
     <xsl:value-of select="@TYPE" />,
    </xsl:when>
    <xsl:otherwise>Home </xsl:otherwise>
   </xsl:choose>
   <xsl:value-of select="STREET" />,
   <xsl:value-of select="CITY" />,
   <xsl:value-of select="STATE" />,
   <xsl:value-of select="ZIP" />,

Cela rend significatif l'espace blanc qui suit chaque virgule, et il se retrouve donc dans la sortie. Si vous enroulez chaque virgule dans <xsl:text> le problème disparaît.

Aussi, débarrassez-vous de cette disable-output-escaping . Cela ne sert à rien ici, puisque vous ne produisez pas de données XML.

0voto

Nick Groznykh Points 19

Ajoutez un modèle dans votre xslt

<xsl:template match="text()"/>

0voto

user3918423 Points 1

Modifiez le code que nous avons utilisé pour formater le fichier xml brut en supprimant les lignes ci-dessous afin de supprimer les espaces blancs supplémentaires ajoutés dans le fichier Excel exporté.

La mise en forme avec le système de propriété indentée ajoute ces espaces blancs supplémentaires.

Commentez les lignes relatives au formatage du xml comme la ligne ci-dessous et essayez.

xmlWriter.Formatting = System.Xml.Formatting.Indented;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X