Filtrare un insieme di nodi con XSLT
Ovviamente questo non sempre sarà possibile in quanto la corrispondenza dei modelli potrebbe avere, a volte, dei risultati spiacevoli nel senso che il risultato potrebbe essere qualcosa di non previsto da noi per via del fatto che, come abbiamo visto, un modello elabora anche i nodi figli, anche quelli non di nostro interesse per l'elaborazione che ci interessa in quel momento. A questo si aggiunga anche che se abbiamo un documento sorgente con parecchio testo, saremo costretti a scrivere più istruzioni affinchè venga elaborato l'elemento che ci interessa.
Potremmo trovarci nella condizione di dover selezionare dei nodi a seconda del loro valore o del nome e non sempre in base alla posizione. Quando si utilizza un predicato per filtrare dei nodi, in un insieme, l'espressione scritta nei predicati deve essere "valutata" e dare come risposta true oppure false. Se l'espressione è true il nodo in questione viene elaborato; diversamente se è false verràignorato.
Come tutti sappiamo i valori true e false sono chiamati booleani. Per poter meglio capire quanto appena scritto, vediamo un documento sorgente XML già utilizzato in qualche lezione precedente. Esso si chiama persone.xml. In questo file abbiamo il nome di 2 persone e come nodi figli tre tipi di telefono:
- casa
- fax
- cellulare
Attraverso il foglio di stile XSLT vogliamo usare un predicato per fare un confronto tra il valore dell'attributo tipo (di telefono) ed il valore casa. In altri termini vogliamo stampare a video i nomi delle persone (2 nel nostro caso) e solo i numeri di telefono di casa, ignorando gli altri.
<xsl:for-each select="persone/persona">
<strong><xsl:value-of select="@nome" /></strong><br />
<xsl:for-each select="telefono[@tipo='casa']">
Telefono <xsl:value-of select="@tipo" />: <xsl:value-of select="." /><br />
<hr />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
È vero che il codice appena scritto potrebbe generare un pò di confusione ma se lo analizziamo, vedremo che è molto semplice.
Estrapoliamo il codice che ci interessa:
Cosa vuol dire questo frammento? Per ogni nodo telefono (xsl:for-each), se il valore dell'attributo tipo corrisponde al valore casa, allora viene elaborato; diversamente viene ignorato. Di conseguenza il listato manda in output solo i numeri di telefono di casa delle persone e non prende in considerazione gli altri tipi. Possiamo vedere l'elaborazione nel file di esempio xml che ho preparato.
Alla prossima.
| < Prec. | Succ. > |
|---|

