205 votes

Produire une nouvelle ligne en XSLT

Je veux produire une nouvelle ligne pour la sortie du texte dans XSLT. Avez-vous des idées ?

13 votes

Je pense qu'il est temps d'accepter la réponse :)

249voto

Florjon Points 1062

Le code XSL suivant produira un nouvelle ligne (saut de ligne) :

<xsl:text>&#xa;</xsl:text>

Pour un retour à la ligne utiliser :

<xsl:text>&#xd;</xsl:text>

7 votes

+1 : cette option est plus robuste que l'option <xsl:text> contenant une approche de type "newline" si vous utilisez quelque chose qui pourrait reformater votre fichier XSL et perturber les espaces blancs.

50voto

Nic Gibson Points 4539

Ma méthode préférée pour ce faire ressemble à ceci :

<xsl:stylesheet>

<xsl:output method='text'/>

<xsl:variable name='newline'><xsl:text>
</xsl:text></xsl:variable>

<!-- note that the layout there is deliberate -->

...

</xsl:stylesheet>

Ensuite, chaque fois que vous souhaitez afficher une nouvelle ligne (peut-être dans un csv), vous pouvez afficher quelque chose comme ce qui suit :

<xsl:value-of select="concat(elem1,elem2,elem3,$newline)" />

J'ai utilisé cette technique lors de la sortie de sql à partir d'une entrée xml. En fait, j'ai tendance à créer des variables pour les virgules, les guillemets et les retours à la ligne.

3 votes

Veuillez noter que la réponse de Florjon ci-dessous est considérablement plus stable que la mienne.

1 votes

Il est probablement utile d'ajouter la déclaration xml:space="preserve" à la xsl:text pour une stabilité accrue, mais je suis d'accord que la réponse de @Florjon est probablement plus sûre.

0 votes

Cette solution présente l'inconvénient d'inclure également toute indentation, ce qui peut ne pas être souhaitable.

47voto

AnthonyWJones Points 122520

Incluez l'attribut Method="text" sur la balise xsl:output et insérez des retours à la ligne dans votre contenu littéral dans la XSL aux endroits appropriés. Si vous préférez garder le code source de votre XSL en ordre, utilisez l'entité &#10; où vous voulez une nouvelle ligne.

31voto

user878525 Points 141

Vous pouvez utiliser : <xsl:text>&#10;</xsl:text>

voir l'exemple

<xsl:variable name="module-info">
  <xsl:value-of select="@name" /> = <xsl:value-of select="@rev" />
  <xsl:text>&#10;</xsl:text>
</xsl:variable>

si vous écrivez ceci dans le fichier, par exemple

<redirect:write file="temp.prop" append="true">
  <xsl:value-of select="$module-info" />
</redirect:write>

cette variable produira une nouvelle ligne dans le fichier comme :

commons-dbcp_commons-dbcp = 1.2.2
junit_junit = 4.4
org.easymock_easymock = 2.4

2voto

Agnes Points 66

J'ai constaté une différence entre les sauts de ligne littéraux en <xsl:text> et les nouvelles lignes littérales en utilisant &#xA; .

Alors que les nouvelles lignes littérales fonctionnaient correctement dans mon environnement (en utilisant Saxon et le processeur Java XSLT par défaut), mon code a échoué lorsqu'il a été exécuté par un autre groupe dans un environnement .NET.

Le passage aux entités ( &#xA; ) a permis à mon code de génération de fichiers de fonctionner de manière cohérente à la fois sur Java et sur .NET.

De plus, les sauts de ligne littéraux sont susceptibles d'être reformatés par les IDE et peuvent être perdus par inadvertance lorsque le fichier est géré par quelqu'un qui n'est pas au courant.

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