Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Filtrare in base a scelte multiple

Filtrare i dati in base a condizioni multiple: xsl:choose
Filtrare i dati in base a condizioni multiple: xsl:choose
Link copiato negli appunti

Se invece vogliamo effettuare delle scelte multiple 
bisogna utilizzare l'elemento <xsl:choose>. Attraverso questo elemento
possiamo definire degli elementi figli che sono <xsl:when> e
<xsl:otherwise> e fare in modo che vengano eseguite determinate regole per ogni tipo di condizione che abbiamo definito. Un esempio ci permetterà di capire meglio come funziona questo elemento.

Esempio 14.

Codice XSLT utilizzato ( listacd_es14.xslt ):

<?xml version="1.0" encoding="UTF-8"?> <!-- Prologo XML -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:template match="/">
       <html>
     
<table>
         
<tr>
        
<td>
            
Evidenziare con colori diversi le righe degli album in base alla loro durata:
        
</td>
         
</tr>
         
<tr>
        
<td bgcolor="#f36622">
            
Giallo se la durata è inferiore a 65 minuti
        
</td>
         
</tr>    
         
<tr>
        
<td bgcolor="#FFFFCC">
            
Arancio se la durata è superiore a 65 minuti
        
</td>
         
</tr>
         
<tr>
        
<td bgcolor="#33ccff">
            
Azzurro se la durata è uguale a 65 minuti
        
</td>
         
</tr>
       </table> 
<hr/>
   <table cellpadding="2" cellspacing="2" bgcolor="#cc0000">
     
<tr bgcolor="#ffffff">
         
<td>    
        
Titolo Album
         
</td>
         
<td>
        
Durata Minuti 
         
</td> 
         
<td>
        
Artista 
         
</td>
     
</tr> 
     
<xsl:apply-templates select="//artista//album"/> 
   </table> 
      </html>
    </xsl:template>

<xsl:template match="//artista//album"> 
    <xsl:choose> 
   <xsl:when test="durata > 65"> <!-- Se durata è maggiore di 65 -->
     
<tr bgcolor="#f36622">
         
<td>
        
<xsl:value-of select="titolo"/>
         
</td>
         
<td>
        
<xsl:value-of select="durata"/> 
         
</td> 
         
<td>
        
<xsl:value-of select="../../@nome"/> 
         
</td>
     
</tr>
   </xsl:when>

   <xsl:when test="durata < 65"> <!-- Se durata è minore di 65 -->
     
<tr bgcolor="#FFFFCC">
         
<td>
        
<xsl:value-of select="titolo"/>
         
</td>
         
<td>
        
<xsl:value-of select="durata"/> 
         
</td> 
         
<td>
        
<xsl:value-of select="../../@nome"/> 
         
</td>
     
</tr>
   </xsl:when>

   <xsl:otherwise> <!-- Altrimenti (quindi quando è uguale a 65) -->
     
<tr bgcolor="#33ccff">
         
<td>
        
<xsl:value-of select="titolo"/>
         
</td>
         
<td>
        
<xsl:value-of select="durata"/> 
         
</td> 
         
<td>
        
<xsl:value-of select="../../@nome"/> 
         
</td>
     
</tr>
   </xsl:otherwise> 

    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

Analizziamo il codice XSLT prima di vedere l'output
HTML. 
All'interno del modello che viene richiamato utilizziamo l'elemento
<xsl:choose> per definire 3 possibili opzioni di scelta.
I primi due elementi sono <xsl:when> che grazie all'attributo test (che
abbiamo usato anche nell'esempio 13 con l'elemento <xsl:if>) controllano:
1) se l'elemento <durata> del nodo in questione è maggiore di 65, il
secondo controlla se è minore di 65 e il terzo elemento invece è
<xsl:otherwise> (che sarebbe altrimenti) il che vuol dire che siamo nel
caso in cui la <durata> è uguale a 65 minuti!
Ogni volta che una delle condizioni si verifica il processore applica le regole
definite dall'elemento in questione e automaticamente ignora le altre e va
oltre. 

Notate che al posto di <xsl:otherwise> avremmo
anche potuto scrivere in modo esplicito <xsl:when test="durata =
65"> perchè ovviamente se non è maggiore di 65 e se non è minore di
65, allora automaticamente per esclusione sarà uguale al numero 65! 

Risultato in Output della trasformazione  (esempio 14).

<html>
    <table>
   <tr>
       <td>
     
Evidenziare con colori diversi le righe degli album in base alla loro durata:
       </td>
   </tr>
   <tr>
       <td bgcolor="#f36622">
     
Giallo se la durata è superiore a 65 minuti
       </td>
   </tr>
   <tr>
       <td bgcolor="#FFFFCC">
     
Arancio se la durata è inferiore a 65 minuti
       </td>
   </tr>
   <tr>
       <td bgcolor="#33ccff">
     
Azzurro se la durata è uguale a 65 minuti
       </td>
       </tr>
    </table>
<hr>

    <table cellpadding="2" cellspacing="2" bgcolor="#cc0000">
   <tr bgcolor="#ffffff">
       <td>
     
Titolo Album
       </td>
       <td>
     
Durata Minuti 
       </td>
       <td>
     
Artista 
       </td>
   </tr>
   <tr bgcolor="#FFFFCC">
       <td>Magic Touch</td>
       <td>59</td>
       <td>Stanley Jordan</td>
   </tr>
   <tr bgcolor="#f36622">
       <td>Stolen Moments</td>
       <td>72</td>
       <td>Stanley Jordan</td>
   </tr>
   <tr bgcolor="#FFFFCC">
       <td>Pink Moon</td>
       <td>47</td>
       <td>Nick Drake</td>
   </tr>
   <tr bgcolor="#FFFFCC">
       <td>Bryter Layter</td>
       <td>55</td>
       <td>Nick Drake</td>    
   </tr>
   <tr bgcolor="#33ccff">
       <td>Five leaves left</td>
       <td>65</td>
       <td>Nick Drake</td>
   </tr>
   <tr bgcolor="#FFFFCC">
       <td>Grace</td>
       <td>54</td>
       <td>Jeff Buckley</td>
   </tr>
   <tr bgcolor="#f36622">
       <td>Mistery white boy</td>
       <td>86</td>
       <td>Jeff Buckley</td>
   </tr>
   <tr bgcolor="#FFFFCC">
       <td>Surfing with the alien</td>
       <td>53</td>
       <td>Joe Satriani</td>
   </tr>
   <tr bgcolor="#FFFFCC">
       <td>Not of this earth</td>
       <td>49</td>
       <td>Joe Satriani</td>
   </tr>
    </table>
</html>

Clicca
qui per vedere il risultato della trasformazione sul browser.


Clicca qui per vedere l'XSLT sul browser.

Ti consigliamo anche