2009-06-19 53 views
21

Desidero implementare il ritorno a capo all'interno di xslt. Il problema è che ho un varible: Fase 1 = Valore 1 breaktag Fase 2 = Valore 2 come una stringa e vorrebbe apparire comeCome implementare il ritorno a capo in XSLT

Fase 1 = Valore 1

Fase 2 = Valore 2

nel modulo HTML, ma io sono sempre il tag BR sui page.Any buoni modi di attuazione di un ritorno avanzamento riga/trasporto in xsl sarebbe apprezzato

+0

Vedere questa domanda molto simile: http://stackoverflow.com/questions/723226/producing-a-new-line-in-xslt – Coder

risposta

0

I separato il v alori da Environment.NewLine e quindi usato un pre tag in html per emulare l'effetto che stavo cercando

3

utilizzare un semplice ritorno a capo in un xsl: elemento di testo

<xsl:text> 
</xsl:text> 
+0

e che è abbastanza fastidioso, quando hai rientri tutto il tuo XML bene, quindi devi mettere questo ... –

+0

La stringa è contenuta nel db e ho provato ad aggiungere ma sta stampando il tag invece di ottenere un'interruzione di riga. – chugh97

0

credo che è possibile utilizzare il tag xsl: testo per questo, come in

<xsl:text> 
</xsl:text> 

Le probabilità sono che mettendo il tag di chiusura su una linea propria, la nuova linea fa parte del testo letterale ed emesso come tale.

+0

La stringa è contenuta nel db e ho provato ad aggiungere ma sta stampando il tag anziché ottenere un'interruzione di riga. – chugh97

42

In alternativa al

<xsl:text> 
</xsl:text> 

si potrebbe usare

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

o

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

nel caso in cui non si vuole rovinare il vostro rientro

+0

La mia stringa è nel database A B e quando renderizzata viene visualizzata così com'è e non un'interruzione di riga ... provato non funziona. Funziona quando è codificato nel file xsl ma i miei valori provengono da db. – chugh97

+0

Penso che siano necessarie ulteriori informazioni per trovare una soluzione al tuo problema. Potresti descrivere più in dettaglio come stai ricevendo la stringa dal database e come stai applicando l'XSL? Qual è il formato della stringa nel database? È semplice testo? XML? – Steef

3

Provatelo alla fine della riga dove volete il ritorno a capo. Ha funzionato per me.

<xsl:text><![CDATA[<br />]]></xsl:text> 
1

Ecco un approccio che utilizza un modello ricorsivo, che cerca &#10; nella stringa dal database e quindi emette il sottostringa prima. Se c'è una sottostringa dopo il &#10; rimanente, il modello chiama se stesso fino a quando non rimane nulla. Nel caso &#10; non è presente, il testo viene semplicemente emesso.

Ecco la chiamata modello (basta sostituire @ActivityExtDescription con il campo del database):

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

e qui è il codice per il modello stesso:

<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> 

Opere come un fascino !!!

+0

Questa è l'unica risposta che ho trovato che ha funzionato per i campi di formattazione recuperati da un database come xml. – swilliams

6

Questo funziona per me, come carriage-return + life feed.

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

"& # 10;" la stringa non funziona.

+1

Questo ha funzionato abbastanza bene aggiungendo un 'CRLF' all'interno del mio XSLT. Convalidato con JEdit e Notepad ++. – Carlos

+0

Funziona incorporato in un elemento di testo con BI Publisher Desktop – DaveCoast

+0

È probabile che & # 10 non funzioni in base a quale visualizzatore si sta utilizzando. Funziona per me con Notepad ++ o sulla riga di comando di Linux. – MikeKulls

3

Stavo cercando una buona soluzione a questo, come molti preferirebbero, senza incorporare sequenze di escape direttamente nelle espressioni, o avere strane interruzioni di riga all'interno di una variabile. Ho trovato un ibrido di entrambi questo si avvicina effettivamente funziona, grazie all'integrazione di un nodo di testo all'interno di una variabile in questo modo:

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

Un altro bel lato-effetto di questo è che è possibile passare in qualsiasi nuova linea che si desidera, sia esso solo LF, CR o entrambi CRLF.

--Daniel

+0

Suggerimento XSLT generale: invece di usare 'xsl: text' nella tua' xsl: variable', usa invece un attributo 'select'. (Esempio: '') In questo modo non si crea un frammento di albero dei risultati non necessario. –

+0

Inoltre, potrebbe essere utile notare che si potrebbe anche usare 'xsl: param' invece di' xsl: variable' in modo da poter passare il valore di "newline" in fase di esecuzione. –

1

Il modo più pulito che ho trovato è quello di inserire !ENTITY dichiarazioni nella parte superiore del foglio di stile per la nuova riga, scheda, e altri costrutti di testo comune. Quando si deve inserire una manciata di elementi di formattazione nell'output, ciò rende il foglio trasformato molto più pulito.

Ad esempio:

<?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> 

...

0

Questa è l'unica soluzione che ha funzionato per me. Tranne che stavo sostituendo & # 10; con \ r \ n

Problemi correlati