XQuery - XQuery

XQuery
Paradigma dichiarativo , funzionale , modulare
Progettato da W3C
Apparso per la prima volta 2007
Rilascio stabile
3.1 / 21 marzo 2017 ; 4 anni fa  ( 21/03/2017 )
Disciplina di battitura dinamico o statico, forte
OS Cross-platform
Estensioni dei nomi di file .xq, .xql, .xqm, .xqy, .xquery
Sito web www .w3 .org / XML / Query /
Principali implementazioni
Molti
Influenzato da
XPath , SQL , XSLT

XQuery ( XML Query ) è un linguaggio di programmazione funzionale e di query che interroga e trasforma raccolte di dati strutturati e non strutturati , solitamente sotto forma di XML , testo e con estensioni specifiche del fornitore per altri formati di dati ( JSON , binario , ecc.). Il linguaggio è sviluppato dal gruppo di lavoro XML Query del W3C . Il lavoro è strettamente coordinato con lo sviluppo di XSLT da parte del gruppo di lavoro XSL; i due gruppi condividono la responsabilità per XPath , che è un sottoinsieme di XQuery.

XQuery 1.0 è diventata una raccomandazione del W3C il 23 gennaio 2007.

XQuery 3.0 è diventata una raccomandazione del W3C l'8 aprile 2014.

XQuery 3.1 è diventata una raccomandazione del W3C il 21 marzo 2017.

"La missione del progetto XML Query è fornire servizi di query flessibili per estrarre dati da documenti reali e virtuali sul World Wide Web, fornendo così finalmente la necessaria interazione tra il mondo Web e il mondo dei database. Infine, le raccolte di file XML saranno essere accessibile come database. "

Caratteristiche

XQuery è un linguaggio di programmazione funzionale, privo di effetti collaterali e orientato all'espressione con un semplice sistema di tipi , riassunto da Kilpeläinen:

Tutte le espressioni XQuery operano su sequenze e valutano sequenze. Le sequenze sono elenchi ordinati di elementi. Gli elementi possono essere nodi , che rappresentano componenti di documenti XML, o valori atomici , che sono istanze di tipi di base di XML Schema come xs: integer o xs: string . Le sequenze possono anche essere vuote o essere costituite da un solo elemento. Non viene fatta alcuna distinzione tra un singolo elemento e una singola sequenza. (...) Le sequenze XQuery / XPath differiscono dagli elenchi in linguaggi come Lisp e Prolog escludendo le sequenze annidate. I progettisti di XQuery potrebbero aver considerato le sequenze annidate non necessarie per la manipolazione del contenuto del documento. La nidificazione, o gerarchia delle strutture dei documenti, è invece rappresentata dai nodi e dalle loro relazioni padre-figlio

XQuery fornisce i mezzi per estrarre e manipolare i dati da documenti XML o da qualsiasi origine dati che può essere visualizzata come XML, come database relazionali o documenti di Office.

XQuery contiene un superset della sintassi delle espressioni XPath per indirizzare parti specifiche di un documento XML. Lo integra con una " espressione FLWOR " simile a SQL per l'esecuzione di join. Un'espressione FLWOR viene costruita dalle cinque clausole dopo le quali prende il nome: FOR, LET, WHERE, ORDER BY, RETURN.

Il linguaggio fornisce anche la sintassi che consente di costruire nuovi documenti XML. Laddove i nomi degli elementi e degli attributi sono noti in anticipo, è possibile utilizzare una sintassi simile a XML; in altri casi, sono disponibili espressioni denominate costruttori di nodi dinamici. Tutti questi costrutti sono definiti come espressioni all'interno del linguaggio e possono essere annidati arbitrariamente.

Il linguaggio è basato su XQuery e XPath Data Model (XDM) che utilizza un modello strutturato ad albero del contenuto informativo di un documento XML, contenente sette tipi di nodi: nodi del documento, elementi, attributi, nodi di testo, commenti, istruzioni di elaborazione e spazi dei nomi.

XDM modella anche tutti i valori come sequenze (un valore singleton è considerato una sequenza di lunghezza uno). Gli elementi in una sequenza possono essere nodi XML o valori atomici. I valori atomici possono essere numeri interi, stringhe, booleani e così via: l'elenco completo dei tipi si basa sui tipi primitivi definiti in XML Schema .

Le funzionalità per l'aggiornamento di documenti o database XML e la funzionalità di ricerca full text non fanno parte del linguaggio principale, ma sono definite negli standard di estensione dei componenti aggiuntivi: XQuery Update Facility 1.0 supporta la funzionalità di aggiornamento e XQuery e XPath Full Text 1.0 supportano la ricerca full text nei documenti XML.

XQuery 3.0 aggiunge il supporto per la programmazione funzionale completa, in quanto le funzioni sono valori che possono essere manipolati (memorizzati in variabili, passati a funzioni di ordine superiore e chiamate dinamicamente).

Esempi

Il codice XQuery di esempio riportato di seguito elenca gli altoparlanti unici in ogni atto dell'opera di Shakespeare Hamlet, codificato in hamlet.xml

 <html><body>
 {
   for $act in doc("hamlet.xml")//ACT
   let $speakers := distinct-values($act//SPEAKER)
   return
     <div>
       <h1>{ string($act/TITLE) }</h1>
       <ul>
       {
         for $speaker in $speakers
         return <li>{ $speaker }</li>
       }
       </ul>
     </div>
 }
 </body></html>

Tutti i costrutti XQuery per eseguire calcoli sono espressioni . Non ci sono dichiarazioni , anche se alcune delle parole chiave sembrano suggerire comportamenti simili a dichiarazioni. Per eseguire una funzione, viene valutata l'espressione all'interno del corpo e viene restituito il suo valore. Quindi per scrivere una funzione per raddoppiare un valore di input, si scrive semplicemente:

declare function local:doubler($x) { $x * 2 }

Per scrivere una query completa che dice "Hello World", si scrive l'espressione:

 "Hello World"

Questo stile è comune nei linguaggi di programmazione funzionale .

Applicazioni

Di seguito sono riportati alcuni esempi di come può essere utilizzato XQuery:

  1. Estrazione di informazioni da un database per l'utilizzo in un servizio Web.
  2. Generazione di report di riepilogo sui dati archiviati in un database XML.
  3. Ricerca di documenti di testo sul Web per informazioni pertinenti e compilazione dei risultati.
  4. Selezione e trasformazione dei dati XML in XHTML da pubblicare sul Web.
  5. Estrazione dei dati dai database da utilizzare per l'integrazione dell'applicazione.
  6. Suddivisione di un documento XML che rappresenta più transazioni in più documenti XML.

XQuery e XSLT a confronto

Scopo

Sebbene XQuery sia stato inizialmente concepito come un linguaggio di query per grandi raccolte di documenti XML, è anche in grado di trasformare singoli documenti. In quanto tale, le sue capacità si sovrappongono a XSLT , che è stato progettato espressamente per consentire la trasformazione dei documenti XML di input in HTML o altri formati.

Gli standard XSLT 2.0 e XQuery sono stati sviluppati da gruppi di lavoro separati all'interno del W3C , lavorando insieme per garantire un approccio comune ove appropriato. Condividono lo stesso modello di dati ( XDM ), sistema di tipi e libreria di funzioni ed entrambi includono XPath 2.0 come lingua secondaria.

Origine

Le due lingue, tuttavia, sono radicate in tradizioni diverse e soddisfano le esigenze di comunità diverse. XSLT è stato concepito principalmente come un linguaggio per fogli di stile il cui obiettivo principale era rendere XML per il lettore umano sullo schermo, sul web (come linguaggio per modelli web ) o su carta. XQuery è stato concepito principalmente come un linguaggio di query di database nella tradizione di SQL .

Poiché le due lingue hanno origine in comunità diverse, XSLT è più forte nella gestione dei documenti narrativi con una struttura più flessibile, mentre XQuery è più forte nella gestione dei dati (ad esempio, quando si eseguono join relazionali).

Versioni

XSLT 1.0 è apparso come Raccomandazione nel 1999, mentre XQuery 1.0 è diventato una Raccomandazione solo all'inizio del 2007; di conseguenza, XSLT è ancora molto più ampiamente utilizzato. Entrambe le lingue hanno un potere espressivo simile, sebbene XSLT 2.0 abbia molte caratteristiche che mancano in XQuery 1.0, come il raggruppamento, la formattazione di numeri e date e un maggiore controllo sugli spazi dei nomi XML. Molte di queste funzionalità sono state pianificate per XQuery 3.0.

Qualsiasi confronto deve tenere conto del fatto che XSLT 1.0 e XSLT 2.0 sono linguaggi molto diversi. XSLT 2.0, in particolare, è stato fortemente influenzato da XQuery nel suo passaggio a una forte tipizzazione e consapevolezza dello schema.

Punti di forza e di debolezza

Studi sull'usabilità hanno dimostrato che XQuery è più facile da imparare rispetto a XSLT , soprattutto per gli utenti con precedenti esperienze di linguaggi di database come SQL. Ciò può essere attribuito al fatto che XQuery è un linguaggio più piccolo con meno concetti da imparare e al fatto che i programmi sono più concisi. È anche vero che XQuery è più ortogonale, in quanto qualsiasi espressione può essere utilizzata in qualsiasi contesto sintattico. Al contrario, XSLT è un sistema a due lingue in cui le espressioni XPath possono essere nidificate nelle istruzioni XSLT ma non viceversa.

XSLT è attualmente più potente di XQuery per le applicazioni che implicano modifiche di piccole dimensioni a un documento (ad esempio, l'eliminazione di tutti gli elementi NOTE). Tali applicazioni sono generalmente gestite in XSLT mediante l'uso di uno schema di codifica che coinvolge un modello di identità che copia tutti i nodi invariati, modificati da modelli specifici che modificano i nodi selezionati. XQuery non ha equivalenti a questo modello di codifica, sebbene nelle versioni future sarà possibile affrontare tali problemi utilizzando le funzionalità di aggiornamento nel linguaggio in fase di sviluppo.

XQuery 1.0 mancava di qualsiasi tipo di meccanismo per il legame dinamico o il polimorfismo; questo è stato risolto con l'introduzione di funzioni come valori di prima classe in XQuery 3.0. L'assenza di questa funzionalità inizia a diventare evidente quando si scrivono applicazioni di grandi dimensioni o quando si scrive codice progettato per essere riutilizzabile in ambienti diversi. XSLT offre due meccanismi complementari in quest'area: la corrispondenza dinamica delle regole del modello e la capacità di sovrascrivere le regole utilizzando xsl:import , che rendono possibile scrivere applicazioni con più livelli di personalizzazione.

L'assenza di queste funzionalità da XQuery 1.0 è stata una decisione di progettazione deliberata: ha come conseguenza che XQuery è molto suscettibile all'analisi statica, essenziale per raggiungere il livello di ottimizzazione necessario nei linguaggi di query del database. Ciò semplifica anche il rilevamento degli errori nel codice XQuery in fase di compilazione.

Il fatto che XSLT 2.0 utilizzi la sintassi XML lo rende piuttosto dettagliato rispetto a XQuery 1.0. Tuttavia, molte applicazioni di grandi dimensioni sfruttano questa capacità utilizzando XSLT per leggere, scrivere o modificare dinamicamente i fogli di stile come parte di una pipeline di elaborazione. L'utilizzo della sintassi XML consente inoltre l'utilizzo di strumenti basati su XML per la gestione del codice XSLT. Al contrario, la sintassi XQuery è più adatta per l'incorporamento in linguaggi di programmazione tradizionali come Java (vedere API XQuery per Java ) o C # . Se necessario, il codice XQuery può anche essere espresso in una sintassi XML chiamata XQueryX. La rappresentazione XQueryX del codice XQuery è piuttosto prolissa e non conveniente per gli umani, ma può essere facilmente elaborata con strumenti XML, ad esempio trasformata con fogli di stile XSLT.

Estensioni e lavori futuri

Estensioni W3C

Due principali estensioni a XQuery sono state sviluppate dal W3C:

Entrambi hanno raggiunto lo stato di raccomandazione come estensioni a XQuery 1.0, ma il lavoro per portarli avanti per lavorare con XQuery 3.0 è stato abbandonato per mancanza di risorse.

Il lavoro su XQuery 3.0 è stato pubblicato come raccomandazione l'8 aprile 2014 e XQuery 3.1 è una raccomandazione a febbraio 2017.

È stata progettata un'estensione di scripting (procedurale) per XQuery, ma non è mai stata completata.

Il EXPath Community Group sviluppa estensioni per XQuery e altri standard correlati ( XPath , XSLT , XProc e XForms ). Attualmente sono disponibili le seguenti estensioni:

  • Sistema di confezionamento
  • Modulo file
  • Modulo binario
  • Applicazioni Web

Estensioni di terze parti

JSONiq è un'estensione di XQuery che aggiunge il supporto per estrarre e trasformare i dati dai documenti JSON . JSONiq è un superset di XQuery 3.0. È pubblicato con la licenza Creative Commons Attribution-ShareAlike 3.0 .

Il progetto EXQuery sviluppa standard sulla creazione di applicazioni XQuery portatili. Attualmente sono disponibili i seguenti standard:

  • RESTXQ

Ulteriore lettura

  • Query XML: XQuery, XPath e SQL / XML nel contesto. Jim Melton e Stephen Buxton. Morgan Kaufmann, 2006. ISBN   1-55860-711-0 .
  • Walmsley, Priscilla (2007). XQuery, prima edizione . O'Reilly Media. ISBN   978-0-596-00634-1 .
  • Walmsley, Priscilla (2015). XQuery, 2a edizione . O'Reilly Media. ISBN   978-1-4919-1510-3 .
  • XQuery: il linguaggio di query XML. Michael Brundage. Addison-Wesley Professional, 2004. ISBN   0-321-16581-0 .
  • XQuery dagli esperti: una guida al linguaggio di query XML del W3C. Howard Katz (a cura di). Addison-Wesley, 2004. ISBN   0-321-18060-7 .
  • Un'introduzione all'espressione XQuery FLWOR . Dr. Michael Kay (Comitato XQuery del W3C), 2005.

Implementazioni

Panoramica delle implementazioni XQuery più diffuse
Nome Licenza linguaggio XQuery 3.1 XQuery 3.0 XQuery 1.0 Aggiornamento XQuery 1.0 XQuery Full Text 1.0
BaseX Licenza BSD Giava
esistere LGPL Giava Parziale Parziale No No
MarkLogic Proprietario C ++ No Parziale No No
Saxon HE Licenza pubblica Mozilla Giava Parziale Parziale No
Saxon EE Proprietario Giava No
Zorba Licenza Apache C ++ No

Altre implementazioni includono:

Sondaggi

Riferimenti

link esterno