Un'introduzione semplice a XPath

`MobileTogether utilizza XPath come linguaggio per formule ed espressioni.`

Se sapete come scrivere formule in un foglio di calcolo Excel, potete imparare facilmente come scrivere formule o espressioni XPath in MobileTogether. È necessario comprendere solo alcuni concetti fondamentali. Lo strumento di creazione di espressioni XPath in MobileTogether semplifica la creazione di queste espressioni, proprio come lo strumento di creazione di formule in Excel vi aiuta a scrivere formule nei vostri fogli di calcolo.

Quindi, perché si chiama XPath?

La "X" in XPath deriva dalle sue origini nel linguaggio XML (eXtensible Markup Language), mentre "Path" si riferisce al fatto che si utilizza un formato simile a un percorso per identificare le singole parti dei dati. Qualsiasi fonte di dati a cui si accede in MobileTogether è rappresentata come una piccola struttura ad albero sul lato destro della finestra di MobileTogether Designer, sotto la sezione "Origini della pagina". Ogni struttura ad albero inizia con una radice che ha un nome, come $XML1 o $DB1, e poi, sotto quella radice, ci sono le singole parti di dati, chiamate elementi. Questi elementi sono organizzati in modo logico, quindi sono meglio rappresentati come alberi in cui è possibile comprimere ed espandere ogni elemento per visualizzare ciò che si trova al suo interno. E la cosa migliore di MobileTogether è che non importa se i dati provengono da un database, da un documento XML, da un servizio web o da qualsiasi altra fonte di dati: vengono tutti presentati nello stesso modo e possono essere accessibili allo stesso modo.

XPath consente di navigare all'interno di queste strutture ad albero per associare gli elementi dei dati agli oggetti dell'interfaccia utente visualizzati sugli schermi dei dispositivi mobili. Il processo è molto simile a come si navigherebbe all'interno di una struttura di directory nel sistema di file di un computer. Indipendentemente dal fatto che siate abituati a Windows, Linux o MacOS, i file sul disco rigido possono essere sempre accessibili tramite un percorso, ad esempio:

C:\Users\Spock\Documents\ScienceRecords 	(Windows)
/Users/Kirk/Documents/BeautifulAlienWomen	(Linux/Mac)

Vediamo ora un esempio di espressione XPath, confrontandola con un'altra:

$DB1/salesdata/region/month/gadgets

Come potete vedere, si tratta esattamente della stessa idea. Si utilizza XPath per navigare all'interno di strutture ad albero di dati, proprio come si utilizzano le espressioni di percorso per navigare all'interno del sistema di file di un computer. XPath utilizza il carattere "/" (barra) per separare gli elementi individuali all'interno del percorso, proprio come Linux e macOS utilizzano questo carattere per separare le directory.

Curiosamente, questa analogia con i percorsi delle directory si applica anche a due abbreviazioni molto comuni in XPath: proprio come un singolo punto (.) si riferisce alla directory corrente in un sistema di file, in XPath il punto (.) si riferisce all'elemento corrente, e analogamente, il doppio punto (..) che si riferisce a una directory padre in un sistema di file, si riferisce all'elemento padre in XPath.

Attributi

Se la vostra fonte di dati è un documento XML, oppure dati XML restituiti da un servizio web, i dati contenuti in quella struttura ad albero si presentano in due forme diverse: elementi e attributi. Gli elementi sono i dati fondamentali in XML e possono essere nidificati, quindi un elemento può avere elementi figli all'interno della struttura ad albero. Gli attributi, invece, sono semplici valori di dati associati agli elementi. Nelle strutture ad albero visualizzate nella sezione "Origini delle pagine", noterete che gli attributi sono indicati con un segno "=" (uguale) prima del loro nome. Questo perché, in un documento XML, gli attributi sono scritti, ad esempio, come "color=\"green\"".

Quando si desidera fare riferimento agli attributi in un'espressione XPath, è necessario scrivere il simbolo "@" (chiocciola) prima del loro nome:

$XML1/salesdata/region/@name

Altrimenti, è possibile eseguire le stesse operazioni con elementi e attributi: ad esempio, è possibile utilizzare entrambi nei calcoli o rappresentare i loro valori in un grafico, e si possono assegnare entrambi a elementi dell'interfaccia utente in un progetto MobileTogether.

Predicati

A volte, non è sufficiente semplicemente specificare il percorso di un elemento nei dati. Spesso, ciò che si desidera fare è selezionare una parte dei dati che corrisponde a determinati criteri, al fine, ad esempio, di visualizzarla in un grafico o presentarla all'utente in una tabella.

Se avete mai lavorato con database relazionali, questo corrisponde alla clausola WHERE tipica in un'istruzione SQL. Permette di selezionare i dati dal vostro database che soddisfano determinati criteri

Il concetto equivalente in XPath si chiama "predicati". Un predicato XPath consente di specificare criteri di selezione che permettono di scegliere solo determinati elementi che corrispondono ai criteri specificati. I predicati vengono inseriti come un test logico racchiuso tra parentesi quadre ([]), ad esempio:

$XML1/salesdata/region[@name=”East”]/Month

L'interpretazione di questa istruzione è la seguente: nella sorgente dati XML1, accedere all'elemento "salesdata", quindi passare al suo elemento figlio "region" e selezionare solo le regioni in cui l'attributo "name" è equivalente a "East", e quindi selezionare il rispettivo elemento figlio "Month".

Operatori

All'inizio, abbiamo detto che XPath è un linguaggio di espressioni completo. Questo significa che non solo permette di selezionare determinate porzioni di dati, ma consente anche di eseguire tutte le operazioni matematiche tipiche sui dati per calcolare nuovi valori. Proprio come le formule in Excel permettono di calcolare nuovi valori a partire dai dati esistenti, è possibile fare esattamente la stessa cosa con le espressioni XPath in MobileTogether.

Supponiamo che vogliate creare una soluzione di fatturazione mobile e desideriate visualizzare l'importo totale per una singola voce di spesa nel vostro modulo mobile:

$DB1/sales/invoice/item/quantity * $DB1/sales/invoice/item/price

Supponendo che la vostra struttura dati abbia elementi separati per la quantità e il prezzo (che potrebbero essere modificabili dall'utente), potete semplicemente calcolare l'importo totale per quella specifica voce moltiplicando la quantità per il prezzo, utilizzando l'operatore di moltiplicazione "*".

Una delle funzionalità più interessanti di XPath è che permette di risparmiare molto tempo di digitazione, consentendo di eseguire direttamente la moltiplicazione all'interno dell'espressione XPath, utilizzando le parentesi nel punto giusto del percorso. In questo modo, la versione abbreviata è equivalente all'espressione precedente:

$DB1/sales/invoice/item/(quantity * price)

Analogamente, è possibile utilizzare i simboli "+" (più) e "-" (meno) come operatori matematici. Tuttavia, è necessario utilizzare un simbolo diverso per la divisione. Poiché stiamo già utilizzando il simbolo "/" (barra) per separare gli elementi individuali in un percorso, non possiamo utilizzare lo stesso carattere per indicare la divisione. Pertanto, l'operatore per la divisione in XPath è la parola "div" per la divisione di numeri reali e "idiv" per la divisione di numeri interi (ovvero, se si desidera che il risultato sia un numero intero anziché un numero reale).

È inoltre una buona pratica, e a volte indispensabile, inserire spazi attorno agli operatori per evitare che vengano confusi con parte del nome di un elemento o di un attributo. Questo è particolarmente importante per l'operatore "-".

Sequenze

Una differenza importante tra i percorsi XPath e i percorsi di directory è che, mentre un'espressione di percorso di directory identifica tipicamente un solo file o una sola directory, un'espressione XPath può effettivamente fare riferimento a più nodi di dati (ovvero, un elemento o un attributo). In realtà, ogni espressione XPath restituisce sempre una sequenza di nodi come risultato.

Questo concetto è più facilmente comprensibile se si considera che la maggior parte dei database contiene righe di dati che hanno una struttura simile, proprio come la maggior parte dei documenti XML, nella loro essenza, contiene una serie di elementi che hanno lo stesso nome e condividono una struttura simile. XPath è stato creato per consentire a uno sviluppatore di lavorare facilmente con questi set di dati; pertanto, la possibilità di accedere a un intero insieme di nodi contemporaneamente offre enormi vantaggi, come vedremo nei prossimi capitoli.

Allo stesso tempo, in alcuni casi potrebbe essere necessario definire esplicitamente delle sequenze in un'espressione XPath, e si farebbe così elencando i valori nel seguente formato:

(1, 2, 3, 4, 5)

Le sequenze sono ordinate, quindi la sequenza sopra descritta è nettamente diversa dalla sequenza (3, 5, 2, 4, 1). Le sequenze possono contenere elementi provenienti dai vostri dati, così come valori numerici costanti o stringhe di testo costanti.

Ad esempio, una possibile sequenza di stringhe potrebbe essere la seguente:

("a", "b", "c", "d", "e")

Infine, ma non meno importante, è possibile specificare sequenze ordinate di valori numerici utilizzando l'operatore di intervallo per:

(1 to 5)

Questo è equivalente alla sequenza (1, 2, 3, 4, 5). Come potete vedere, questo operatore di intervallo può essere utilizzato per creare rapidamente sequenze di valori numerici che sarebbero troppo complesse da elencare manualmente, soprattutto quando i numeri diventano più grandi.

per l'espressione

Se avete già lavorato con altri linguaggi di programmazione, riconoscerete il ciclo "for" come uno strumento molto comune, presente in molte lingue moderne in una forma o nell'altra, ed è anche una parte fondamentale del linguaggio di espressione XPath.

Nella sua forma più semplice, un'espressione "for" in XPath consente di iterare su una sequenza di valori o nodi utilizzando una variabile temporanea che viene definita direttamente all'interno dell'espressione "for". Ad esempio, l'espressione..

for $i in (1 to 10) return 2 * $i

genererà la sequenza numerica (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) iterando sulla sequenza originale (da 1 a 10) utilizzando la variabile $i, e quindi calcolando 2 * $i per ogni elemento della sequenza.

Ora che sappiamo che qualsiasi espressione XPath può restituire una sequenza di nodi, possiamo utilizzare l'espressione "for" per iterare su questi nodi ed eseguire alcune operazioni matematiche. Ad esempio, per iterare su tutte le voci di un documento di fattura e calcolare l'importo corrispondente per ciascuna voce, potremmo utilizzare questa espressione:

for $x in $DB1/sales/invoice/item return $x/price * $x/quantity

In questo caso, la variabile $x sarà la nostra variabile di iterazione, che scorrerà ogni elemento dell'elenco, e questa espressione restituirà una sequenza contenente gli importi per ogni voce della nostra fattura. Supponiamo di avere i seguenti due elementi nell'origine dati della nostra fattura:

<item>
  <quantity>5</quantity>
  <price>12.50</price>
</item>
<item>
  <quantity>3</quantity>
  <price>27.85</price>
</item>

Successivamente, l'espressione XPath precedente restituirà la sequenza (62,5 83,55), che rappresentano gli importi corrispondenti per ciascuna voce presente nella fattura.

Funzioni

Le funzioni in XPath funzionano esattamente come le funzioni in una formula di Excel o nella maggior parte degli altri linguaggi di programmazione: si chiama una funzione utilizzando il suo nome e passando un insieme di parametri della funzione tra parentesi (). Ad esempio, per sommare la sequenza (3, 9, 14), si scriverebbe:

sum( (3, 9, 14) )

Questo ci darebbe il risultato di 26. Si noti che, in questo caso, le parentesi esterne fanno parte della chiamata alla funzione `sum()`, mentre le parentesi interne fanno parte della sequenza che stiamo passando alla funzione come un unico parametro.

Analogamente, possiamo ora calcolare l'importo totale della fattura, prendendo come esempio precedente, sommando tutti gli elementi presenti nella fattura

sum( for $x in $DB1/sales/invoice/item
    return $x/price * $x/quantity )

Questo può essere molto utile, ad esempio, per creare moduli interattivi all'interno di una soluzione mobile, in cui è possibile visualizzare i valori dei dati relativi ai totali, che si aggiorneranno dinamicamente man mano che l'utente inserisce i dati nel modulo.

XPath contiene un gran numero di funzioni integrate per valori numerici (ad esempio, round, abs, floor, ecc.), manipolazione di stringhe (ad esempio, concat, lower-case, contains, replace), durate, date e orari, nonché operazioni aggregate su sequenze (ad esempio, count, sum, avg, min, max). Lo strumento di creazione di espressioni XPath in MobileTogether semplifica la scrittura di espressioni XPath utilizzando queste funzioni, poiché include un comodo elenco di tutte le funzioni disponibili, con una breve descrizione e informazioni sui parametri richiesti. Le funzioni sono presentate in gruppi logici, il che rende facile trovare la funzione necessaria per il caso d'uso specifico.

se [condizione] / se... allora..

Spesso, nei linguaggi di programmazione, così come nei linguaggi di espressione, è necessario decidere un metodo diverso per calcolare un determinato risultato, a seconda che un certo criterio sia soddisfatto o meno. È in questi casi che entra in gioco l'istruzione "if", che permette di definire risultati alternativi in base a un criterio di verifica che si specifica.

In XPath, l'istruzione "if" assume la seguente forma:

if ( test-expression ) then expression else expression

dove "test-expression" è un'espressione XPath logica che restituisce un valore booleano (vero o falso).

Ad esempio, possiamo utilizzare una simile impostazione in MobileTogether per rendere il colore del testo di un'etichetta o di un campo di input dipendente dal valore numerico contenuto nei dati. Supponiamo di avere un elemento proveniente dalla nostra fonte dati associato a un campo di input. Possiamo selezionare quel campo di input e passare alla scheda delle proprietà, dove possiamo selezionare la proprietà "Colore del testo". Invece di definire il colore utilizzando il selettore di colori, possiamo cliccare sull'icona XPath nella barra degli strumenti e decidere di definire il colore del testo di quel campo di input tramite un'espressione XPath:

if ( $MT_ControlValue >= 0 ) then "green" else "red"

Qui stiamo utilizzando una delle variabili predefinite di MobileTogether per fare riferimento al controllo corrente e stiamo verificando se il suo valore è maggiore o uguale a zero.

A seconda del risultato di quel test, il risultato sarà "verde" o "rosso", e il colore del testo cambierà dinamicamente in base all'input dell'utente.

Analogamente, esistono molte altre variabili predefinite, tutte che iniziano con $MT_, che consentono di prendere decisioni in base alle dimensioni dello schermo del dispositivo, al sistema operativo, alla lingua e a molti altri fattori. Tutte queste variabili globali predefinite possono essere visualizzate nella finestra di dialogo "Variabili globali" nel menu "Progetto" di MobileTogether Designer.

XQuery

Finora, abbiamo parlato principalmente di XPath per motivi storici, poiché è il linguaggio di espressione basato su XML più conosciuto ed è in uso da 15 anni. Tuttavia, oltre a XPath, MobileTogether supporta anche il linguaggio XQuery, più potente. XQuery è una vera e propria estensione di XPath, il che significa che ogni espressione XPath valida è anche un'espressione XQuery valida. XQuery, tuttavia, aggiunge alcune funzionalità aggiuntive che consentono di fare molto di più e permettono di manipolare o creare interi documenti XML in tempo reale.

Espressione FLWOR

L'espressione XQuery più importante è quella cosiddetta espressione FLWOR. FLWOR è un acronimo che sta per "For-Let-Where-Order-Return" e viene comunemente pronunciato "flower". Funzionalmente, è equivalente all'istruzione SELECT di SQL, che presenta clausole simili, come FROM, WHERE, ORDER BY, ecc. L'espressione FLWOR ci permette di interrogare i dati XML e del database in modo molto più efficiente e potente rispetto alle semplici espressioni XPath, e costituisce la base fondamentale di XQuery.

Abbiamo già incontrato la parte "for" dell'espressione nella nostra precedente discussione su XPath, quindi quella parte dell'espressione FLWOR sarà un punto di partenza familiare. Allo stesso modo, abbiamo visto la clausola "return" nella stessa espressione "for" in precedenza. Tuttavia, XQuery amplia notevolmente la flessibilità della clausola "return" consentendovi di creare intere strutture XML partendo da zero, utilizzando dei costruttori. In sostanza, come prima, la clausola "return" viene valutata per ogni elemento nel ciclo "for", ma invece di produrre semplicemente un valore in una sequenza, ora è possibile costruire un'intera sottostruttura XML, come vedremo in alcuni degli esempi che seguono.

Lo scopo della clausola "let" in un'espressione FLWOR è definire variabili aggiuntive che possiamo utilizzare in seguito per costruire il risultato. Queste variabili possono provenire dalla stessa fonte di dati o anche da una fonte diversa, ma, ad esempio, possiamo utilizzare la variabile del ciclo per selezionare determinati elementi dall'altra fonte.

Ad esempio, supponiamo che una fonte di dati contenga informazioni sui dipartimenti all'interno di un'organizzazione, e un'altra fonte di dati contenga informazioni sui dipendenti. Questo potrebbe essere l'inizio di un'espressione FLWOR che seleziona i dipendenti appartenenti a un determinato insieme di dipartimenti:

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]

La clausola "where" ci permette di filtrare i dati in base a determinati criteri, in modo simile a come abbiamo utilizzato i predicati nelle espressioni XPath standard. Ad esempio, possiamo utilizzarla per filtrare i dipartimenti in base al numero di dipendenti che hanno:

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10

Infine, la clausola "order by" ci permette di ordinare i risultati in base a qualsiasi criterio desiderato, il che è particolarmente utile quando si creano nuovi documenti XML a partire dai risultati.

Ora, mettiamo insieme l'intera espressione FLWOR utilizzando le due fonti di dati precedentemente menzionate, contenenti informazioni sui dipartimenti e sui dipendenti. Ad esempio, potremmo generare una nuova tabella di dati da visualizzare in una soluzione mobile che fornirebbe informazioni aggregate sul numero di dipendenti e sullo stipendio medio per quei dipartimenti che hanno più di 10 dipendenti:

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10
order by avg($e/salary) descending
return
<big-dept>
   { $d,
      <headcount>{count($e)}</headcount>,
      <avgsal>{avg($e/salary)}</avgsal>
   }
</big-dept>

In un altro esempio, utilizzando i nostri dati precedenti sulle fatture telefoniche dettagliate, possiamo ora estendere questa funzionalità e analizzare più fatture successive a una determinata data, calcolando i loro totali e creando una tabella con i risultati ordinati, visualizzando prima la fattura con l'importo totale più alto e infine quella con l'importo più basso

for $inv in $DB1/sales/invoice
let $total := sum (for $x in item return $x/price * $x/quantity)
	where $inv/date >= "2014-01-01"
	order by $total descending
	return <invtotal>{ $total }</invtotal>

Come potete vedere, la flessibilità e la potenza di queste espressioni XQuery sono notevolmente superiori a ciò che potevamo ottenere in precedenza con solo XPath. Tuttavia, una maggiore potenza comporta anche una maggiore complessità, quindi potrebbe volerci del tempo prima di padroneggiare completamente XQuery.

Allo stesso tempo, il costruttore e il valutatore XPath & XQuery integrati in MobileTogether possono aiutarvi notevolmente nella scrittura di espressioni corrette e nel test di queste con i vostri dati. Insieme al potente simulatore che consente di eseguire direttamente le vostre applicazioni mobile all'interno di MobileTogether Designer, potete testare e risolvere i problemi della selezione dei dati tramite XPath e XQuery in modo semplice e sviluppare applicazioni mobile potenti molto più rapidamente rispetto a qualsiasi altro approccio.

Riassunto

In questo documento, abbiamo fornito un'introduzione graduale ai concetti più importanti di XPath e XQuery, per aiutarvi a iniziare a lavorare con i dati in MobileTogether. Abbiamo trattato i concetti fondamentali delle espressioni XPath e alcune delle funzionalità più avanzate di XQuery, che dovrebbero consentirvi di creare selezioni di dati efficaci nei vostri flussi di lavoro mobile, generare grafici precisi dei vostri dati e personalizzare l'interfaccia utente della vostra soluzione mobile in risposta a elementi di dati specifici, secondo le vostre esigenze.

Tuttavia, questo documento è solo un punto di partenza e non intende essere una guida completa né spiegare ogni aspetto di questi linguaggi. Potete approfondire l'argomento nel nostro corso online gratuito e completo su XPath, adatto sia ai principianti che agli utenti esperti.

MobileTogether supporta completamente i linguaggi XPath 3.0 e XQuery 3.0. Il vantaggio di utilizzare uno standard internazionale come XPath e XQuery è che molti sviluppatori potrebbero aver già appreso XPath in passato, quando lavoravano con XML, XSLT o XML Schema. Pertanto, la possibilità di riutilizzare queste conoscenze in MobileTogether rappresenta un grande vantaggio per loro. Inoltre, l'aggiornamento delle proprie conoscenze da XPath 1.0 o 2.0 a 3.0 è un processo semplice.

Inoltre, XPath e XQuery sono standard sviluppati dal W3C, e non linguaggi proprietari creati da una singola azienda, quindi l'apprendimento di questi standard sarà utile anche in altri contesti.

Per la specifica completa di XPath 3.0 e XQuery 3.0, si prega di consultare i seguenti documenti tecnici:

Infine, ma non meno importante, l'utilizzo di XPath e XQuery in MobileTogether significa che è possibile utilizzare facilmente XMLSpy per prototipare, sviluppare e debuggare espressioni XPath e XQuery più complesse, qualora sia necessario approfondire ulteriormente. XMLSpy offre un valutatore XPath completo e un debugger XQuery, inclusi strumenti di profilazione per l'ottimizzazione delle prestazioni.

Per saperne di più su XPath 3.0 e XQuery 3.0, consultare le pagine di formazione online e la documentazione di Altova, disponibili al link Altova’s online training. Offriamo inoltre un riferimento su XPath che spiega tutti gli operatori e le funzioni di XPath e fornisce esempi di come implementarli. Infine, non esitate a porre domande relative a XPath e XQuery nel forum di supporto di MobileTogether, disponibile all'indirizzo https://support.mobiletogether.com/