web-dev-qa-db-fra.com

Comment implémenter le retour chariot dans XSLT

Je souhaite implémenter un retour chariot dans xslt . Le problème est que j’ai une variable: Step 1 = Valeur 1 breaktag

Étape 1 = Valeur 1

Étape 2 = Valeur 2

dans le formulaire HTML mais je reçois la balise br sur la page.Tout bon moyen d'implémenter un retour à la ligne/un retour chariot en xsl serait apprécié

21
chugh97

J'ai séparé les valeurs par Environment.NewLine, puis utilisé une balise pré en HTML pour émuler l'effet recherché

0
chugh97

Comme alternative à

<xsl:text>
</xsl:text>

vous pourriez utiliser 

<xsl:text>&#10;</xsl:text> <!-- newline character -->

ou

<xsl:text>&#13;</xsl:text> <!-- carriage return character -->

au cas où vous ne voudriez pas gâcher votre retrait

42
Steef

Cela fonctionne pour moi, comme retour de chariot + fil de la vie. 

<xsl:text>&#xD;&#xA;</xsl:text>

Le ".

7

utiliser un simple retour chariot dans un élément xsl: text

<xsl:text>
</xsl:text>
4
Pierre

Je recherchais une solution intéressante à ce problème, comme beaucoup préféreraient, sans intégrer de séquences d'échappement directement dans les expressions, ni avoir de sauts de ligne étranges à l'intérieur d'une variable. J'ai trouvé un hybride des deux approches qui fonctionnent réellement, en incorporant un nœud de texte dans une variable comme celle-ci:

<xsl:variable name="newline"><xsl:text>&#10;</xsl:text></xsl:variable>
<xsl:value select="concat(some_element, $newline)" />

Un autre inconvénient gentil de ceci est que vous pouvez passer dans la nouvelle ligne que vous voulez, que ce soit juste LF, CR ou les deux CRLF.

--Daniel

3
Daniel

Essayez ceci à la fin de la ligne où vous voulez le retour chariot. Cela a fonctionné pour moi. 

<xsl:text><![CDATA[<br />]]></xsl:text>
3
Ken

La méthode la plus simple que j'ai trouvée consiste à insérer des déclarations !ENTITY en haut de la feuille de style pour les nouvelles lignes, les tabulations et les autres constructions de texte courantes. Lorsque vous devez insérer un grand nombre d'éléments de formatage dans votre sortie, la feuille de transformation a l'air beaucoup plus nette.

Par exemple:

<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
    <!ENTITY nl "<xsl:text>
</xsl:text>">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="step">
    &nl;&nl;
    <xsl:apply-templates  />
  </xsl:template>

... 

2
Como

Voici une approche qui utilise un modèle récursif, qui recherche &#10; dans la chaîne de la base de données, puis génère la sous-chaîne avant . S'il reste une sous-chaîne après le &#10;, le modèle s'appelle jusqu'à ce qu'il ne reste plus rien. Si &#10; n'est pas présent, le texte est simplement affiché.

Voici l'appel de modèle (remplacez simplement @ActivityExtDescription par votre champ de base de données):

<xsl:call-template name="MultilineTextOutput">
    <xsl:with-param name="text" select="@ActivityExtDescription" />
</xsl:call-template>

et voici le code pour le modèle lui-même:

<xsl:template name="MultilineTextOutput">
<xsl:param name="text"/>
<xsl:choose>
    <xsl:when test="contains($text, '&#10;')">
        <xsl:variable name="text-before-first-break">
            <xsl:value-of select="substring-before($text, '&#10;')" />
        </xsl:variable>
        <xsl:variable name="text-after-first-break">
            <xsl:value-of select="substring-after($text, '&#10;')" />
        </xsl:variable>

        <xsl:if test="not($text-before-first-break = '')">
            <xsl:value-of select="$text-before-first-break" /><br />
        </xsl:if>

        <xsl:if test="not($text-after-first-break = '')">
            <xsl:call-template name="MultilineTextOutput">
                <xsl:with-param name="text" select="$text-after-first-break" />
            </xsl:call-template>
        </xsl:if>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$text" /><br />
    </xsl:otherwise>
</xsl:choose>

Fonctionne comme un charme !!!

1
Jens Hupkau

Je crois que vous pouvez utiliser la balise xsl: text pour cela, comme dans

<xsl:text>
</xsl:text>

Il est fort probable qu'en plaçant la balise de fermeture sur une ligne distincte, la nouvelle ligne fait partie du texte littéral et est affichée en tant que telle.

0
Frerich Raabe