2012-09-07 8 views
10

Desidero assegnare più variabili a seconda di un ambiente di condizione. So come fare per una sola variabile:XSLT: imposta più variabili in base alla condizione

<xsl:variable name="foo"> 
    <xsl:choose> 
     <xsl:when test="$someCondition"> 
      <xsl:value-of select="3"/> 
     <xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="4711"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Ma cosa succede se voglio assegnare due variabili in base alla stessa condizione $ someCondition?

Non voglio scrivere lo stesso xsl: scegli di nuovo l'istruzione, perché è un po 'lunga e intensa nel calcolo nell'esempio reale.

L'ambiente in questione è libxslt (xslt 1.0) con estensioni exslt.

EDIT: Quello che voglio è un comportamento simile a quello

if (condition) { 
    foo = 1; 
    bar = "Fred"; 
} 
else if (...) { 
    foo = 12; 
    bar = "ASDD"; 
} 
(... more else ifs...) 
else { 
    foo = ...; 
    bar = "..."; 
} 

risposta

11

Che cosa si potrebbe avere è la variabile principale restituisce un elenco di elementi; uno per ogni variabile che si desidera impostare

<xsl:variable name="all"> 
    <xsl:choose> 
     <xsl:when test="a = 1"> 
      <a> 
       <xsl:value-of select="1"/> 
      </a> 
      <b> 
       <xsl:value-of select="2"/> 
      </b> 
     </xsl:when> 
     <xsl:otherwise> 
      <a> 
       <xsl:value-of select="3"/> 
      </a> 
      <b> 
       <xsl:value-of select="4"/> 
      </b> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable> 

Quindi, utilizzando la funzione EXSLT, è possibile convertire ad un 'insieme di nodi' che possono poi essere utilizzato per impostare le variabili individuali

<xsl:variable name="a" select="exsl:node-set($all)/a"/> 
    <xsl:variable name="b" select="exsl:node-set($all)/b"/> 

Don Dimentica che è necessario dichiarare il namepsace per le funzioni exslt nell'XSLT affinché funzioni.

+0

Quello è un bel uno :-) – Jost

+0

+1 idea brillante! – Fernando

3

Ma cosa succede se desidero assegnare due variabili in base alla stessa condizione $ someCondition?

Non voglio scrivere lo stesso xsl: scegliere di nuovo l'istruzione, perché è un po 'lungo e intensivo nel calcolo nell'esempio reale.

Supponendo che i valori delle variabili non sono nodi, questo codice non utilizza alcuna funzione di estensione per definirli:

<xsl:variable name=vAllVars> 
    <xsl:choose> 
     <xsl:when test="$someCondition"> 
      <xsl:value-of select="1|Fred"/> 
     <xsl:when> 
     <xsl:when test="$someCondition2"> 
      <xsl:value-of select="12|ASDD"/> 
     <xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="4711|PQR" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

<xsl:variable name="foo" select="substring-before($vAllVars, '|')"/> 
<xsl:variable name="bar" select="substring-after($vAllVars, '|')"/> 
+0

Usando questo, foo e bar avranno sempre lo stesso valore. Non è quello di cui ho bisogno ... Vedi la mia modifica per chiarimenti. – Jost

+0

@ Sì, guarda il mio aggiornamento. Ogni volta che i valori delle variabili non sono nodi, è più semplice e probabilmente più efficiente non costruire (e convertire) un albero dei risultati. –

+0

questa soluzione dovrebbe funzionare. Esiste tuttavia un inconveniente: è necessario un separatore che non può mai verificarsi in nessuno dei valori delle variabili, che può essere difficile da trovare. E dopo averlo scelto, questo sarebbe un posto dove roba potrebbe rompersi in futuro quando qualche altra parte del programma cambia ... – Jost

Problemi correlati