Il y a trois raisons pour obtenir des espaces blancs non désirés dans le résultat d'une transformation XSLT :
- les espaces blancs qui se trouvent entre les nœuds du document source
- les espaces blancs qui proviennent de l'intérieur des nœuds du document source
- les espaces blancs qui proviennent de la feuille de style
Je vais parler des trois car il peut être difficile de savoir d'où vient l'espace blanc et vous devrez peut-être utiliser plusieurs stratégies.
Pour traiter l'espace blanc qui se trouve entre les nœuds dans votre document source, vous devez utiliser la fonction <xsl:strip-space>
pour supprimer les espaces qui apparaissent entre deux nœuds, puis utiliser la fonction <xsl:preserve-space>
afin de préserver les espaces blancs importants qui pourraient apparaître dans un contenu mixte. Par exemple, si votre document source ressemble à :
<ul>
<li>This is an <strong>important</strong> <em>point</em></li>
</ul>
alors vous voudrez ignorer l'espace entre les mots-clés <ul>
y el <li>
et entre les </li>
y el </ul>
ce qui n'est pas significatif, mais préservez l'espace entre les caractères d'imprimerie. <strong>
y <em>
éléments, qui es significatif (sinon vous obtiendriez "Ceci est une important* point*"). Pour ce faire, utilisez
<xsl:strip-space elements="*" />
<xsl:preserve-space elements="li" />
El elements
l'attribut <xsl:preserve-space>
doit essentiellement répertorier tous les éléments de votre document qui ont un contenu mixte.
A propos : l'utilisation <xsl:strip-space>
réduit également la taille de l'arbre source en mémoire, et rend votre feuille de style plus efficace, donc cela vaut la peine de le faire même si vous n'avez pas de problèmes d'espaces blancs de ce genre.
Pour traiter les espaces blancs qui apparaissent à l'intérieur des nœuds de votre document source, vous devez utiliser la méthode suivante normalize-space()
. Par exemple, si vous avez :
<dt>
a definition
</dt>
et vous pouvez être sûr que le <dt>
ne contient aucun élément avec lequel vous voulez faire quelque chose, alors vous pouvez le faire :
<xsl:template match="dt">
...
<xsl:value-of select="normalize-space(.)" />
...
</xsl:template>
Les espaces en tête et en queue de page seront supprimés de la valeur de la balise <dt>
et vous obtiendrez simplement la chaîne de caractères "a definition"
.
En ce qui concerne les espaces blancs provenant de la feuille de style, ce qui est peut-être le cas pour vous, c'est lorsque vous avez du texte dans un modèle comme celui-ci :
<xsl:template match="name">
Name:
<xsl:value-of select="." />
</xsl:template>
Les feuilles de style XSLT sont analysées de la même manière que les documents sources qu'elles traitent, de sorte que le XSLT ci-dessus est interprété comme un arbre qui contient un fichier <xsl:template>
avec un élément match
dont le premier enfant est un nœud de texte et le second un nœud de type <xsl:value-of>
avec un élément select
attribut. Le nœud texte comporte des espaces en tête et en queue (y compris les sauts de ligne) ; comme il s'agit d'un texte littéral dans la feuille de style, il est littéralement copié dans le résultat, avec tous les espaces en tête et en queue.
Mais un peu de Les espaces blancs dans les feuilles de style XSLT sont automatiquement supprimés, notamment ceux entre les nœuds. Vous n'obtenez pas de saut de ligne dans votre résultat parce qu'il y a un saut de ligne entre l'élément <xsl:value-of>
et la clôture de la <xsl:template>
.
Pour obtenir uniquement le texte que vous voulez dans le résultat, utilisez la fonction <xsl:text>
élément comme celui-ci :
<xsl:template match="name">
<xsl:text>Name: </xsl:text>
<xsl:value-of select="." />
</xsl:template>
Le processeur XSLT ne tiendra pas compte des sauts de ligne et de l'indentation qui apparaissent entre les nœuds, et n'affichera que le texte contenu dans l'élément <xsl:text>
élément.