gototopgototop
 
Sei in: Home Page Corso XSLT Elaborazione condizionale con XSLT

Elaborazione condizionale con XSLT

Il filtraggio ci va molto vicino ma quello che si può ottenere grazie all'elaborazione condizionale è molto arduo ottenerlo con espressioni di predicato o modelli per la corrispondenza. Il concetto fondamentale è che tramite l'elaborazione condizionale un segmento di codice viene eseguito se sono vere alcune condizioni.

L'elaborazione condizionale ha due modi diversi di operare:

  • una permette di eseguire un segmento di codice in base ad una condizione;
  • l'altra permette di selezionare un segmento di codice da eseguire con più condizioni.

Elaborazione condizionale semplice

Essa è la forma più semplice di elaborazione ed utilizza l'elemento xsl:if il quale ha un attributo test. Il valore di questo attributo deve essere un'espressione che genera un valore booleano; se il valore che ne vien fuori è true, viene eseguito il corpo dell'elemento, altrimenti no. Vediamo un esempio di questa elaborazione partendo dal documento XML senza nessun foglio di stile. Supponiamo di voler scrivere i nomi delle persone, così come appaiono nell'albero XML, con una virgola tra uno e l'altro ma l'ultimo deve terminare con un punto. Il codice che scriveremo è il seguente:

<xsl:template match="/">
Nomi:
<xsl:for-each select="persone/persona">
<xsl:value-of select="@nome" />
<xsl:if test="position() != last()">, </xsl:if>
<xsl:if test="position() = last()">.</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Possiamo vedere il risultato ottenuto grazie alla trasformazione.

La riga di codice:

<xsl:for-each select="persone/persona">

seleziona tutti gli elementi persona ed itera attraverso essi. Al rigo successivo il valore dell'attributo nome viene mandato in output. Adesso vedremo da vicino l'elemento xsl:if. La prima delle 2 righe in cui è presente l'elaborazione verifica che il nodo corrente non sia l'ultimo nodo e, se così fosse, viene inserita una virgola. La riga successiva, al contrario, verifica che il nodo sia l'ultimo e, se così è, inserisce un punto.

Immaginiamo adesso di creare lo stesso elenco senza usare l'elemento xsl:for-each o dei modelli. Non è possibile inserire una virgola per ogni elemento ma, se lo si fa, anche l'ultimo terminerà con essa. Con i modelli, molto probabilmente, si dovrebbe scrivere altro codice aggiuntivo; come abbiamo visto, invece, con l'elaborazione condizionale, ne bastano solo 2 di righe.

Adesso che abbiamo cominciato ad addentrarci nell'elaborazione condizionale, vediamo cosa otteniamo se applichiamo xsl:if al documento sorgente XML che già conosciamo. Dovremmo ottenere lo stesso risultato che abbiamo avuto, e di cui abbiamo trattato, nella lezione precedente, circa le funzioni su insieme di nodi. Il codice XSLT è il seguente:

<xsl:template match="/">
<xsl:for-each select="persone/persona/telefono">
<xsl:if test="position()=2">
<strong><xsl:value-of select="../@nome" /></strong><br />
<xsl:value-of select="@tipo" />: <xsl:value-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Il risultato di output ci mostra la trasformazione.

Effettivamente... non è quello che ci si aspettava, o no? Abbiamo ricevuto un solo elemento, esattamente il primo. Come mai?
Quando si applica un filtro (è il caso della lezione precedente), l'epressione che filtra gli insiemi dei nodi, vede i numeri di telefono di ogni persona come un insieme di nodi separati. Il rigo di codice:

<xsl:for-each select="persone/persona/telefono">

li trasforma in un unico insieme di nodi. Per cui il contesto della riga successiva è un insieme di nodi di tutti gli elementi telefono delle persone; quindi dà risultato positivo su un unico nodo.

© www.extrowebsite.com - Grafica, layout, articoli e guide sono di esclusiva proprietà del webmaster - Tutti i diritti riservati