Torna alla pagina di Tecnologie Web
:: Tecnologie Web ::
XPath
Indice
XPath è una sintassi che consente di riferirsi a parti di documenti XML associati ad un DTD o ad un XML Schema. Un descrittore XPath è pensato per essere inserito in un documento XML, in particolare come valore di un attributo.
XPath è in grado di indicare i nodi in base alla loro posizione assoluta o relativa, al loro tipo, al loro contenuto ed in base ad altri criteri. Le espressioni XPath sono anche in grado di rappresentare numeri, stringhe o valori booleani, in modo da permettere ai fogli di stile XSLT di svolgere operazioni aritmetiche per numerare elementi o gestire riferimenti incrociati.
XPath vede un documento XML come un albero di nodi e il suo scopo è proprio quello di individuare nodi e insiemi di nodi all'interno di questo albero:
Notiamo che nell'elenco mancano alcune componenti tipiche dei documenti XML, cioè le sezioni CDATA, le referenze a entità e le dichiarazioni del tipo di documento. Però XPath è in grado di identificare qualsiasi valore al loro interno.
NOTA:
Gli esempi sottostanti si rifanno a questo documento XML:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE racconti SYSTEM "racconti.dtd"> <racconti> <!-- Questo commento lo inserisco perché mi serve provare il rilevamento dei commenti di XPath :P --> <racconto autore="Howard Phillips Lovecraft"> <titoloItaliano>L'estraneo</titoloItaliano> <titoloOriginale>The Outsider</titoloOriginale> <notaIntroduttiva> The Outsider è considerato uno degli esempi più palesi dell'influsso che lo stile e le tematiche di Edgar Allan Poe hanno esercitato su Lovecraft. La storia ha una sottintesa nota autobiografica. Nel protagonista, che cresce solo in una grande casa, nutrendo la sua cultura di vecchi libri, è facile riconoscere l'infanzia solitaria dello stesso Lovecraft. L'invocazione finale all'oblio di fronte agli orrori dell'esistenza da "estraneo" proiettato nel mondo comune si ripeterà continuamente nella sua opera, soprattutto quella poetica, nella quale si riflettono più chiaramente le angosce dell'anima. </notaIntroduttiva> <frammento> Infelice chi dell'infanzia ha soltanto memorie di paura e tristezza. Sventurato chi, volgendosi indietro, non vede che ore solitarie trascorse in sale vaste e malinconiche tappezzate di lugubri tendaggi e file esasperanti di libri antichi, o in desolate veglie in boschi crepuscolari fitti di immensi alberi grotteschi coperti da erbe, che agitano silenziosi in alto i rami contorti... </frammento> </racconto> <racconto autore="Edgar Allan Poe"> <titoloItaliano>La mascherata della Morte Rossa</titoloItaliano> <titoloOriginale>The Mask of the Red Death</titoloOriginale> <frammento> La settima stanza era pesantemente avvolta in panneggi di velluto nero che pendevano ovunque dal soffitto e dalle pareti, ricadendo in pesanti pieghe su un tappeto della stessa stoffa e colore. In quest'unica stanza pero' la tinta delle finestre non corrispondeva alle decorazioni. Le vetrate erano di colore scarlatto, di un cupo color sangue. Ora in nessuna di quele sette stanze vi era una sola lampada o candelabro, pur tra la profusione di ornamenti dorati sparsi qua e la' o pendenti dai soffitti. </frammento> </racconto> <racconto autore="Howard Phillips Lovecraft"> <titoloItaliano>La musica di Erich Zann</titoloItaliano> <titoloOriginale>The Music of Erich Zann</titoloOriginale> <notaIntroduttiva> Quando il saggista francese Jacques Bergier chiese a Lovecraft se avesse mai visitato Parigi, per averne descritto così bene l'atmosfera di certi quartieri, Lovecraft gli rispose:"certo che l'ho visitata. Con Poe, in sogno". Malgrado l'apparenza onirica non è tratta da un unico sogno; tuttavia ho sognato spesso di strade tortuose come la Rue d'Auseil. </notaIntroduttiva> <frammento> Riuscii invece a sentire la musica del vecchio muto: prima salendo in punta di piedi fino al quinto piano, poi trovando il coraggio necessario per inerpicarmi su per l'ultima rampa scricchiolante che conduceva alla mansarda di Zann. E lì, nell'angusto pianerottolo davanti alla porta sprangata e col buco della serratura tappato, più volte udii suoni che mi colmarono di un terrore indefinibile, un terrore di occulti prodigi e celati misteri. </frammento> </racconto> </racconti>
Location Path letteralmente significa percorso di locazione e identifica un insieme di nodi di un documento tramite un location step(passo di locazione). L'insieme di nodi può essere vuoto, contenere un singolo nodo o numerosi nodi; ogni nodo può rappresentare uno degli elementi presenti nell'albero dei nodi, quindi: un elemento, un attributo, un namespace, un testo, un commento, un'istruzione di elaborazione, il nodo radice o una combinazione di questi.
Il Root Location Path corrisponde al carattere: / e ha lo scopo di selezionare il nodo radice del documento.
/ rappresenta un location path assoluto, perché la posizione identificata è indipendente dal contesto del nodo ed è sempre il nodo radice del documento.
Questo location path coincide con il nome di un singolo elemento e il suo scopo è quello di selezionare tutti gli elementi figli il cui nome coincida con quello specificato.
Questo location path è un XPath relativo, in quanto gli elementi individuati dipendono da quale sia il nodo corrente(il contesto).
Esempio:
Inserendo in XPath il comando:
/racconti/racconto
otteniamo:
Gli attributi degli elementi possono essere selezionati tramite XPath utilizzando il carattere @ seguito dal nome dell'attributo.
Esempio:
Inserendo in XPath il comando:
/racconti/racconto/@autore
otteniamo:
Per poter individuare i nodi di commento, di testo e istruzioni di elaborazione dobbiamo utilizzare rispettivamente:
Esempio:
Inserendo in XPath il comando:
/racconti/comment()
otteniamo:
Esempio:
Inserendo in XPath il comando:
/racconti/racconto/notaIntroduttiva/text()
otteniamo:
Esistono tre tipi di caratteri Jolly che permettono di trovare una corrispondenza con differenti tipi di elementi e nodi.
Esempio:
Inserendo in XPath il comando:
/racconti/racconto/*
otteniamo:
Esempio:
Inserendo in XPath il comando:
/racconti/racconto/node()
otteniamo:
Esempio:
Inserendo in XPath il comando:
/racconti/racconto/@*
otteniamo:
In questo caso abbiamo ottenuto lo stesso risultato di /racconti/racconto/@autore perché nel documento XML ho inserito un unico tipo di attributo, se ce ne fossero stati degli altri il comando li avrebbe visualizzati.
Una corrispondenza multipla consiste nella corrispondenza tra più tipi di elementi o attributi e si ottiene utilizzando il carattere |, che permette appunto di combinare location step individuali.
I location path compositi consistono nella combinazione dei singoli location step visti fino ad ora.
Ci sono quattro tipi di location path compositi:
I predicati entrano in gioco quando ci interessa selezionare solo alcuni nodi all'interno dell'insieme dei nodi rintracciati.
Ogni step di un location path può contenere un predicato che effettui una selezione dalla lista di nodi che risultino essere correnti in quel determinato step dell'espressione. I predicati possono essere utilizzati in una combinazione qualsiasi dei location step che compongono un location path.
I predicati contengono un'espressione booleana che viene verificata per ognuno dei nodi contenuti nella lista dei nodi di contesto correnti; se l'espressione ha valore falso il nodo corrispondente viene cancellato dalla lista, altrimenti rimane nella lista.
I predicati possono anche non avere valore booleano, in questo caso si converte il tipo differente in un valore booleano in questo modo:
XPath supporta gli operatori relazionali classici: =, <, >, <=, >=, !=. Gli operatori < e <= se si trovano in un documento XML è necessario utilizzare le referenze a entità <, infatti anche le espressioni XPath devono rispettare le regole di ben formazione tipiche dei documento XML.
XPath supporta anche gli operatori booleani: or e and per poter combinare logicamente più espressioni.
Tutti i location path visti fino ad ora erano location path abbreviati, ma esistono anche i location path non abbreviati più complessi da scrivere ma più flessibili.
Ogni location step di un location path è composto da tre porzioni:
Nella forma abbreviata l'asse e il test di nodo sono combinati, mentre nella forma non abbreviata sono separati da due caratteri due punti ::
La sintassi abbreviata permette di muoversi solo lungo gli assi child(figli), parent(padre), self(se stesso), attribute(attributo), descendant-of-self(discendenti o se stesso), mentre la sintassi non abbreviata aggiunge altri otto assi lungo i quali è possibile muoversi:
Le espressioni XPath, oltre ai location path, possono anche restituire numeri, valori booleani e stringhe che sono ammissibili per fornire valori dell'attributo select degli elementi xsl:value-of e all'interno dii predicati di location path.
Le funzioni XPath sono chiamate che manipolano gli oggetti selezionati, ritornando un valore. Tutte le funzioni restituiscono uno dei quattro tipi di dato seguenti:
Notiamo quindi che le funzioni XPath non possono restituire void.
XPath non è un linguaggio fortemente tipizzato come Java quindi è possibile utilizzare qualsiasi tipo(dei quattro previsti) come argomento della funzione, indipendentemente dal tipo di dato che ci si aspetta di ricevere; l'elaboratore infatti cercherà di convertirlo nel tipo desiderato.
Le funzioni sono riconoscibili dalla presenza di due parentesi tonde alla fine, all'interno delle quali è possibile inserire eventuali argomenti.
XPath mette a disposizione molte funzioni utili, che ovviamente non possiamo analizzare tutte in dettaglio, però ne vediamo qualcuna: