2010-09-03 18 views
10

Devo creare una variabile XSL con una scelta al suo interno. Come il seguente:Come posso rimuovere spazi bianchi quando dichiari una variabile XSL?

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1"> 
     inside 
    </xsl:when> 
    <xsl:otherwise> 
     outside 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

E più tardi nel mio codice, faccio un xsl se:

<xsl:if test="$grid_position = 'inside'"> 
    {...code...} 
</xsl:if> 

Il problema è che la mia variabile è mai = 'dentro' a causa delle interruzioni di linea e trattino. Come posso rimuovere gli spazi bianchi dalla mia variabile? So che posso rimuoverlo usando disable-output-escaping="yes" quando lo uso in un xsl: copy-of, ma non funziona sul tag xsl: variable. Quindi, come posso rimuovere quegli spazi bianchi e interruzioni di riga?

+0

Buona domanda (+1). Vedi la mia risposta per un'espressione XPath breve, con un solo liner per la tua '' :) –

risposta

16

Questo è quello che <xsl:text> è per:

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1"> 
     <xsl:text>inside</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>outside</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Esso permette di strutturare il codice e di controllo spazio bianco allo stesso tempo.

In effetti, è necessario evitare i nodi di testo in XSL che non sono racchiusi in <xsl:text> per evitare questo tipo di bug anche in futuro (ad esempio quando il codice viene riformattato o rielaborato in seguito).

Per casi semplici, come nell'esempio, anche what Jim Garrison suggests è un'opzione.


Per inciso, test per l'esistenza di un elemento con count() è superfluo. Selezionarlo è sufficiente, poiché il set di nodi vuoto viene valutato su false.

<xsl:when test="/Element"> 
+0

Grazie per questa soluzione Tomalak, funziona perfettamente! – Gabriel

+0

@Gabriel: prego.:) – Tomalak

+0

+1 per la spiegazione del valore booleano del set di nodi –

4

Il modo più semplice è di non mettere gli spazi lì, in primo luogo:

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1">inside</xsl:when> 
    <xsl:otherwise>outside</xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
+0

+1 correzione più semplice. – Tomalak

+0

+1 per il modo più semplice –

+2

Grazie per la risposta, ma sono andato con la risposta di Tomalak perché non voglio che il mio codice si interrompa se qualcuno riformatta il codice xsl per aggiungere un'interruzione di riga. – Gabriel

1

Basta usare:

+0

+1 per un'espressione di linea –

+0

+1 per questo ottimo suggerimento. Mi manca spesso l'operatore ternario "?:" Di C/Java/JavaScript. – dolmen

2

Le strategie delle altre risposte sono buone, infatti preferibile a questo quando fattibile. Ma ci sono momenti in cui non hai il controllo (o è più difficile da controllare) cosa c'è nella variabile. In tali casi, è possibile spogliare lo spazio circostante quando si sta testando la variabile:

Invece di

<xsl:if test="$grid_position = 'inside'"> 

uso

<xsl:if test="normalize-space($grid_position) = 'inside'"> 

normalize-space() strisce principali e spazio vuoto iniziale, e crolli altri spazi bianchi ripetuti a quelli singoli.

+0

+1 Questa è la risposta ovvia che è mancata finora. Memorizzare gli spazi bianchi in eccesso e poi spogliarli di nuovo non è elegante, ma a volte non c'è modo di aggirarlo, ad es. quando non hai alcuna influenza sull'XML. – Tomalak

Problemi correlati