XSLT e le funzioni
Abbiamo visto cosa sono i predicati e come lavorano; essi fanno un confronto per filtrate i nodi. Nel presente articolo vedremo un pò più da vicino cosa sono le espressioni.
Possiamo dire che esse hanno una natura "circolare": vale a dire che contengono elementi che a loro volta possono comprendere espressioni. Osserviamo meglio una espressione per capire come è costruita. Il nostro documento XML lo abbiamo utilizzato per altri esempi e comunque possiamo dargli un ulteriore sguardo.
Se noi scrivessimo:
possiamo affermare che è una espressione di corrispondenza o di selezione e potrebbe essere utilizzata o in un modello oppure con un elemento xsl:for-each. Viene chiamata, inoltre, location path (percorso di posizione) perchè, come possiamo notare, punta a specifici nodi nell'albero dei nodi. Il percorso di posizione utilizza l'indirizzamento assoluto in quanto comincia con uno slash ( / ). Il percorso di posizione consiste in diversi location steps (passi di posizione) separati, appunto, da uno "/". Ogni passo di posizione è composto da:
- Un asse opzionale
- Un test di nodo
- Uno o nessun predicato
Nel codice precedente child specifica l'asse del terzo passo di posizione. E' separato dal test di nodo con il doppio segno dei due punti (::). Negli altri 2 passi di posizione, gli assi sono impliciti (e sono anch'essi child). Fin qui, credo, la cosa è abbastanza semplice. Qualche difficoltà cominceremo ad averla quando vedremo i predicati; essi sono utilizzati per una più precisa corrispondenza o selezione.
Un concetto molto importante è il seguente: l'espressione definita entro un predicato deve sempre restituire un valore booleano.
Se il valore è true, il nodo viene elaborato. Se, invece, è false viene ignorato.
Usare più predicati
Possiamo utilizzare anche più di una espressione. Si può trovare più di una corrispondenza solo con l'aggiunta di altri predicati. In questo caso il nodo verrà elaborato solo se tutti i predicati restituiscono true. Vediamo una espressione di questo tipo:
L'espressione appena scritta trovacorrispondenza solo con elementi telefono che si trovano nella prima posizione e che hanno un attributo tipo con il valore casa. Si possono aggiungere quanti attributi si vuole.
Combinare le espressioni
La "combinazione" di espressioni prevede l'omissione di più predicati. Il codice scritto sopra lo si potrebbe scrivere anche in un altro modo:
In questo modo le espressioni vengono combinate utilizzando l'operatore and. Solo se entrambe le espressioni sono true l'intera espressione restituirà true. Si possono anche creare espressioni che restituiscono true quando una sola è true. In questo caso viene introdotto un altro operatore: or. Vediamo il codice:
Le espressioni che si utilizzano nei predicati possono anche essere utilizzate con xsl:if e xsl:when. Siccome non si possono unire due predicati, si deve utilizzare l'operatore booleano and per combinare le espressioni. Vediamo adesso un esempio su come usare xsl:choose con un elemento xsl:when, con una espressione di test.
<xsl:for-each select="persone/persona">
<h2><xsl:value-of select="@nome" /></h2>
<xsl:for-each select="telefono">
<xsl:choose>
<xsl:when test="@tipo='fax'">
<p>Fax: <xsl:value-of select="." /></p>
</xsl:when>
<xsl:when test="@tipo='cellulare' or @tipo='casa' ">
<p>Telefono: <xsl:value-of select="." /></p>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
La trasformazione di questo documento possiamo vederla nel file di output.
Nel listato che ho scritto qui su entrambi i telefoni, di casa e cellulare, sono stati trattati come normali telefoni. la riga di codice:
utilizza una espressione combinata impiega l'operatore or affinchè si ottenga il risultato che abbiamo visto. Se l'espressione a sinistra, o a destra, dell'operatore, o entrambe, sono true, il nodo viene elaborato.
| < Prec. | Succ. > |
|---|

