gototopgototop
 
Sei in: Home Page Corso XSLT Usare il carattere jolly con XPath

Usare il carattere jolly con XPath

Lo possiamo usare solamente per far corrispondere nomi di elementi o di attributi. Se scrivessimo, per esempio, una espressione del tipo: (y*), non vuol dire che cerchiamo corrispondenza con gli elementi che cominciano con la lettera y. Questo con XPath non funziona. Il carattere jolly serve quando vogliamo cercare molto più a fondo nel sorgente XML. Vediamo un esempio di codice con il carattere jolly in azione:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/menu/*/piatto">
+ <xsl:value-of select="text()" /><br />
</xsl:template>

</xsl:stylesheet >

Il risultato dell´applicazione possiamo vederlo nel file di esempio. Abbiamo visto che il risultato genera tutti i nodi "piatto" e non solo quelli di un nodo particolare. Ecco a cosa serve, e quanto è comodo, il carattere jolly. C´è da dire, però, che se non si vuole tutta una serie di nodi non deve essere usato il carattere jolly; possiamo utilizzare, in quel caso, i predicati (che abbiamo già visto). Si ha un maggior controllo sull´elemento al quale il carattere jolly corrisponde. Vediamo un esempio:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:value-of select="/menu/*[3]/piatto[2]" /><br />
Prezzo: <xsl:value-of select="/menu/*[3]/piatto[2]/@*[2]" />
</xsl:template>

</xsl:stylesheet >

Il risultato in output del file di esempio è uguale ed identico a quello che abbiamo visto in precedenza: abbiamo voluto puntare il nome di uno dei dolci più il suo prezzo. Invece di usare i nodi per nome, abbiamo inserito caratteri jolly e predicati. L´elemento dolci è il 3° figlio dell´albero menu e la parte di codice /menu/*[3] indica al processore di prendere il terzo elemento figlio di menu, quale che sia il suo nome. Il percorso genera l´elemento dolci, come se fosse stato "chiamato", come nell´esempio precedente. Per quanto riguarda il prezzo (cioè l´attributo), il percorso dice al processore di prendere il secondo attributo dell´elemento piatto, cioè prezzo.

Intervenire sull´albero del documento con XPath

Fin qui abbiamo usato l´albero del documento XML ma XPath potrebbe fare molto di più con i percorsi di posizione, vale a dire espressioni che selezionano un nodo, o insieme di nodi, relativamente al nodo contesto. Un´altra parte di un percorso di posizione, che abbiamo già incontrato, è il test di nodo che è la parte del percorso di posizione corrispondente ad un nodo o un insieme di nodi. Osserviamo il seguente codice:

/menu/*[3]/piatto[2]/@*[2]

menu, piatto e @* sono test di nodo.
L´ultima parte di un percorso di posizione si chiama asse ed è l´espressione che specifica la relazione in un albero tra i nodi selezionati ed il nodo contesto. Negli esempi che abbiamo fatto abbiamo visto molti percorsi di posizione tipo:

menu/dolci/piatto

Questo percorso di posizione seleziona tutti gli elementi "piatto", figli del nodo "dolci" a sual volta figlio del nodo "menu". Se lo scrivessimo per esteso, avremmo:

child::menu/child::dolci/child::piatto

L´asse e il test di nodo sono separati da una coppia di due punti. L´asse prima del test di nodo indica al processore dove cercare un nodo o un insieme di nodi. Un altro asse che conosciamo è l´asse dell´attributo, che abbiamo usato con il carattere @:

/menu/dolci/piatto[2]/@prezzo

Possiamo scrivere la selezione @prezzo utilizzando l´asse dell´attributo, in questo modo:

/menu/dolci/piatto[2]/attribute::prezzo

Un altro asse è quello del "genitore". Esso restituisce il nodo genitore del contesto corrente. Vediamo un esempio:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>

<xsl:template match="/menu/aperitivi/piatto">
<xsl:value-of select="parent::*/@titolo" />:
<xsl:value-of select="." /><br />
</xsl:template>

<xsl:template match="/menu/primipiatti" />
<xsl:template match="/menu/dolci" />

</xsl:stylesheet >

La riga di codice: <xsl:value-of select="parent::*/@titolo" /> utilizza l´asse del genitore per selezionare l´attributo "titolo". Questo rappresenta il genitore del nodo corrente che è uno degli elementi "piatto" nell´elemento "aperitivi". Adesso vediamo l´output del file di esempio. L´attributo "titolo"viene inserito con ogni elemento "piatto". Lo si poteva fare anche con un indirizzamento assoluto ma se ci fosse stato un modello separato per l´elemento "piatto", anche i piatti di dolci e primipiatti potevano corrispondere e, in questo caso, il titolo avrebbe avuto un risultato diverso.

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