# XPath- en XQuery-tutorial

## Een eenvoudige introductie tot XPath

`[MobileTogether](mobiletogether.md) gebruikt XPath als programmeertaal voor formules en expressies.`

Als u weet hoe u formules in een Excel-spreadsheet kunt maken, kunt u gemakkelijk leren hoe u XPath-formules of -expressies in MobileTogether kunt maken. U hoeft slechts een paar basisconcepten te begrijpen. De XPath-editor in MobileTogether maakt het eenvoudig om XPath-expressies te construeren, net zoals de formule-editor in Excel u helpt bij het maken van formules in uw spreadsheets.

### Waarom heet het dan XPath?

De "X" in XPath komt voort uit de oorsprong in XML, de eXtensible Markup Language, en "Path" verwijst naar het feit dat u een pad-achtig formaat gebruikt om individuele onderdelen van uw data te identificeren. Elke databron die u in MobileTogether benadert, wordt weergegeven als een kleine boomstructuur aan de rechterkant van uw MobileTogether Designer-venster, onder "Pagina bronnen". Elke boomstructuur begint met een wortel die een naam heeft, zoals $XML1 of $DB1, en daaronder bevinden zich individuele datastukken – die elementen worden genoemd. Deze elementen zijn logisch genest, waardoor ze het beste worden weergegeven als bomen waarin u elk element kunt in- en uitklappen om te zien wat eronder zit. En het beste van MobileTogether is: het maakt niet uit of de onderliggende data afkomstig is van een database, een XML-document, een webservice of een andere databron – ze worden allemaal op dezelfde manier gepresenteerd en kunnen op dezelfde manier worden benaderd.

XPath stelt u in staat om door deze boomstructuren te navigeren, zodat u uw data-elementen kunt koppelen aan gebruikersinterface-objecten op de schermen van uw mobiele apparaten. Dit is vergelijkbaar met hoe u door een mapstructuur in het bestandssysteem van een computer zou navigeren. Of u nu gewend bent aan Windows, Linux of MacOS, bestanden op uw harde schijf kunnen altijd worden benaderd via een pad, zoals:

C:\Users\Spock\Documents\ScienceRecords 	(Windows)/Users/Kirk/Documents/BeautifulAlienWomen	(Linux/Mac)Laten we daarom een voorbeeld van een XPath-expressie bekijken, door middel van een vergelijking

$DB1/salesdata/region/month/gadgetsZoals u kunt zien, is het precies hetzelfde idee. U gebruikt XPath om door datastructuren te navigeren, net zoals u paden gebruikt om door uw bestandssysteem op de harde schijf van een computer te navigeren. XPath gebruikt het teken "/" (voorwaartse schuine streep) om individuele elementen in het pad te scheiden, net zoals Linux en MacOS dat teken gebruiken om mappen te scheiden.

Interessant genoeg geldt deze analogie met directorypaden ook voor twee veelvoorkomende afkortingen in XPath: net zoals een enkele punt (.) verwijst naar de huidige directory in een bestandssysteem, verwijst de punt (.) in XPath naar het huidige element, en op dezelfde manier verwijst de dubbele punt (..) die verwijst naar een bovenliggende directory in een bestandssysteem, ook naar het bovenliggende element in XPath.

### Kenmerken

Als uw gegevensbron een XML-document is, of XML-gegevens die worden geretourneerd door een webservice, dan komt de data die in die boomstructuur zit in twee verschillende vormen: elementen en attributen. Elementen zijn de belangrijkste datapunten in XML en kunnen genest zijn, wat betekent dat een element kinderen kan hebben in de boomstructuur. Attributen, daarentegen, zijn eenvoudige datawaarden die aan elementen zijn gekoppeld. In de boomstructuren onder "Pagina-bronnen" ziet u dat attributen worden weergegeven met een "=" (gelijkteken) voor hun naam. Dit komt doordat in een XML-document attributen worden geschreven als, bijvoorbeeld, "color="green"".

Wanneer u verwijzingen naar attributen in een XPath-expressie wilt maken, moet u een "@"-teken (at-teken) voor hun naam plaatsen:

$XML1/salesdata/region/@nameAnders gezegd, u kunt hetzelfde doen met elementen en attributen: u kunt ze beide gebruiken in berekeningen, of hun waarden weergeven in een grafiek, en u kunt ze beide toewijzen aan gebruikersinterface-elementen in een MobileTogether-ontwerp.

### Predikaten

Soms is het niet voldoende om simpelweg het pad naar een element in uw data op te geven. Wat u vaak wilt doen, is een selectie maken van de data die voldoet aan bepaalde criteria, om bijvoorbeeld die data in een grafiek weer te geven of aan de gebruiker in een tabel te presenteren.

Als u ooit met relationele databases heeft gewerkt, komt dit overeen met de typische WHERE-clausule in een SQL-statement. Hiermee kunt u de gegevens uit uw database selecteren die aan bepaalde criteria voldoen

Het equivalente concept in XPath wordt "predicaten" genoemd. Een XPath-predicaat stelt u in staat om selectiecriteria op te geven, waardoor alleen bepaalde elementen worden geselecteerd die aan de opgegeven criteria voldoen. Predicaten worden ingevoerd als een logische test, omsloten door vierkante haken ([]), bijvoorbeeld:

$XML1/salesdata/region[@name=”East”]/MonthDe manier om deze instructie te interpreteren is als volgt: Ga in de databron "XML1" naar het element "salesdata", ga vervolgens naar het subelement "region" en selecteer alleen die regio's waarbij de attribuutnaam gelijk is aan "East". Selecteer vervolgens het bijbehorende subelement "Month" voor elke geselecteerde regio.

### Operatoren

We hebben in het begin al gezegd dat XPath een complete expressietaal is. Dat betekent dat het niet alleen mogelijk is om bepaalde gegevensselecties te maken, maar dat het u ook in staat stelt om alle gebruikelijke wiskundige bewerkingen op de gegevens uit te voeren om nieuwe waarden te berekenen. Net zoals formules in Excel u in staat stellen om nieuwe waarden te berekenen op basis van uw bestaande gegevens, kunt u met XPath-expressies in MobileTogether hetzelfde doen.

Stel dat u een mobiele factureringsoplossing wilt ontwikkelen en het totale bedrag voor een afzonderlijke post in uw mobiele formulier wilt weergeven:

$DB1/sales/invoice/item/quantity * $DB1/sales/invoice/item/priceUitgaande van het feit dat uw datastructuur afzonderlijke elementen heeft voor de hoeveelheid en de prijs (die mogelijk door de gebruiker kunnen worden aangepast), kunt u dan eenvoudig het totale bedrag voor die specifieke regel berekenen met behulp van de bovenstaande vermenigvuldiging, waarbij u het asterisk-teken (*) gebruikt.

Een van de handige functies van XPath is dat u veel tijd kunt besparen door de vermenigvuldiging direct in de XPath-expressie uit te voeren, door haakjes te gebruiken op het juiste punt in de padnaam. Deze verkorte versie is dus equivalent aan de bovenstaande expressie:

$DB1/sales/invoice/item/(quantity * price)Op dezelfde manier kunt u de symbolen + (plus) en - (min) gebruiken als wiskundige operatoren. Maar u moet een ander symbool gebruiken voor deling. Omdat we al de / (schuine streep) gebruiken om individuele elementen in een pad te scheiden, kunnen we hetzelfde teken niet gebruiken voor een deling. Daarom is de operator voor deling in XPath het woord "div" voor een deling met reële getallen en "idiv" voor een deling met gehele getallen (d.w.z. als u wilt dat het resultaat een geheel getal is in plaats van een reëel getal).

Het is ook een goede gewoonte – en soms zelfs noodzakelijk – om spaties rondom uw operatoren te plaatsen, zodat ze niet verward kunnen worden met een deel van een element- of attribuutnaam. Dit is vooral belangrijk voor de - (min) operator.

### Reeksen

Een belangrijk verschil tussen XPath en paden naar bestanden en mappen is dat een pad naar een bestand of map doorgaans slechts één specifiek bestand of map identificeert, terwijl een XPath-expressie daadwerkelijk naar meer dan één dataknoop (d.w.z. een element of een attribuut) kan verwijzen. Sterker nog, elke XPath-expressie retourneert altijd een reeks knooppunten als resultaat.

Dit is het gemakkelijkst te begrijpen als u bedenkt dat de meeste databases rijen data bevatten die een vergelijkbare structuur hebben, net zoals de meeste XML-documenten in de kern een reeks elementen bevatten die dezelfde naam hebben en een vergelijkbare structuur delen. XPath is ontwikkeld om een ontwikkelaar in staat te stellen gemakkelijk met dergelijke datasets te werken. Het vermogen om een hele set knooppunten tegelijkertijd aan te spreken, biedt aanzienlijke voordelen, zoals we in de volgende hoofdstukken zullen zien.

Tegelijkertijd kan het soms noodzakelijk zijn om sequenties expliciet te definiëren in een XPath-expressie, en dat doet u door de waarden op te sommen in de volgende vorm:

(1, 2, 3, 4, 5)Volgordes zijn geordend, dus de bovenstaande volgorde is duidelijk anders dan de volgorde (3, 5, 2, 4, 1). Volgordes kunnen knooppunten uit uw data bevatten, evenals constante numerieke waarden of constante tekstwaarden.

Bijvoorbeeld, een mogelijke reeks tekens zou er als volgt kunnen uitzien:

("a", "b", "c", "d", "e")Ten slotte, maar niet minder belangrijk, kunt u met behulp van de bereikoperator specifieke, opeenvolgende reeksen van numerieke waarden definiëren om:

(1 to 5)Dit komt overeen met de reeks (1, 2, 3, 4, 5) – zoals u kunt zien, kan deze bereikoperator worden gebruikt om snel reeksen van numerieke waarden te genereren, wat anders te omslachtig zou zijn om handmatig op te sommen, vooral wanneer de getallen groter worden.

### voor expressie

Als u in het verleden met andere programmeertalen heeft gewerkt, zult u de "for"-lus herkennen als een veelgebruikt hulpmiddel dat in veel moderne talen in een bepaalde vorm aanwezig is. Het is ook een essentieel onderdeel van de XPath-expressie taal.

In de meest eenvoudige vorm stelt een "for"-expressie in XPath u in staat om een reeks waarden of knooppunten te doorlopen met behulp van een tijdelijke lusvariabele die direct in de "for"-expressie wordt gedefinieerd. Bijvoorbeeld, de expressie..

for$iin (1 to 10) return 2 * $iDe code genereert de numerieke reeks (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) door de oorspronkelijke reeks (van 1 tot 10) te doorlopen met behulp van de variabele $i, en vervolgens voor elk element in de reeks de waarde 2 * $i te berekenen.

Nu we weten dat elke XPath-expressie een reeks knooppunten kan retourneren, kunnen we ook de "for"-expressie gebruiken om over die knooppunten te itereren en een wiskundige bewerking uit te voeren. Bijvoorbeeld, om over alle afzonderlijke posten in een factuur te itereren en het bedrag voor elke post te berekenen, kunnen we deze expressie gebruiken:

for$xin$DB1/sales/invoice/item return$x/price * $x/quantityIn dit geval is $x onze lusvariabele die door elk element van de items loopt, en deze expressie retourneert een reeks die de bedragen voor elke regel in onze factuur bevat. Laten we aannemen dat we de volgende twee items in onze factuurgegevens hebben:

<item><quantity>5</quantity><price>12.50</price></item><item><quantity>3</quantity><price>27.85</price></item>Vervolgens zal de vorige XPath-expressie de reeks (62,5 83,55) retourneren, die de respectievelijke bedragen zijn voor elk afzonderlijk item op de factuur.

### Functies

Functies in XPath werken precies zoals functies in een Excel-formule of in de meeste andere programmeertalen: u roept een functie aan met behulp van de naam en door een reeks functieparameters tussen haakjes () mee te geven. Bijvoorbeeld, om de reeks (3, 9, 14) op te tellen, zou u het volgende schrijven:

sum( (3, 9, 14) )Dit zou ons het resultaat opleveren van 26. Let op dat in dit geval de buitenste haakjes deel uitmaken van de functieaanroep naar de `sum()`-functie, terwijl de binnenste haakjes deel uitmaken van de reeks die we als één parameter aan de functie doorgeven.

Op dezelfde manier kunnen we nu het totale bedrag van de factuur berekenen, zoals in het vorige voorbeeld, door alle afzonderlijke posten bij elkaar op te tellen:

sum( for$xin$DB1/sales/invoice/itemreturn$x/price * $x/quantity )Dit kan erg nuttig zijn, bijvoorbeeld voor het maken van interactieve formulieren binnen een mobiele applicatie, waarbij u gegevenswaarden voor totalen kunt weergeven die dynamisch veranderen naarmate de gebruiker gegevens in het formulier invoert.

XPath bevat een groot aantal ingebouwde functies voor numerieke waarden (bijvoorbeeld round, abs, floor, enz.), stringmanipulatie (bijvoorbeeld concat, lowercase, contains, replace), tijdsduren, datums en tijdstippen, evenals aggregatiefuncties voor reeksen (bijvoorbeeld count, sum, avg, min, max). De XPath-bouwer in MobileTogether maakt het eenvoudig om XPath-expressies te schrijven met behulp van deze functies, omdat deze een handig overzicht bevat van alle beschikbare functies, met een korte beschrijving en informatie over de vereiste parameters. De functies worden weergegeven in logische groepen, waardoor het gemakkelijk is om de functie te vinden die u nodig heeft voor uw specifieke toepassing.

### Als expressie

In programmeertalen, en ook in expressietalen, is het vaak nodig om op een andere manier een bepaald resultaat te berekenen, afhankelijk van of aan een bepaalde voorwaarde wordt voldaan of niet. Hier komt de "if"-statement (voorwaardelijke instructie) om de hoek kijken, waarmee u alternatieve resultaten kunt definiëren op basis van een door u gespecificeerde testvoorwaarde.

In XPath heeft de "if"-statement de volgende vorm:

if ( test-expression ) then expression else expressionwaarbij "test-expression" een logische XPath-expressie is die "waar" of "onwaar" retourneert.

Bijvoorbeeld, we kunnen zo'n statement in MobileTogether gebruiken om de tekstkleur van een label of een invoerveld afhankelijk te maken van de numerieke waarde die in de data is opgeslagen. Stel dat we een element uit onze databron hebben gekoppeld aan een invoerveld. We kunnen dat invoerveld selecteren en naar het tabblad "Eigenschappen" gaan, waar we de eigenschap "Tekstkleur" kunnen selecteren. In plaats van de kleur te definiëren met de kleurenpallet, kunnen we op het XPath-icoon in de werkbalk klikken en besluiten om de tekstkleur van dat invoerveld te definiëren via een XPath-expressie:

if ( $MT_ControlValue >= 0 ) then"green"else"red"Hier gebruiken we een van de ingebouwde MobileTogether-variabelen om te verwijzen naar het huidige controle-element, en we testen of de waarde groter is dan of gelijk is aan nul.

Afhankelijk van het resultaat van die test, zal het resultaat ofwel "groen" of "rood" zijn, en de kleur van onze tekst zal dynamisch veranderen op basis van de input van de gebruiker.

Op dezelfde manier zijn er nog veel meer ingebouwde variabelen die allemaal beginnen met $MT_ en waarmee u beslissingen kunt nemen op basis van het schermformaat van het apparaat, het besturingssysteem, de taal en vele andere factoren. Al deze ingebouwde globale variabelen kunt u bekijken in het dialoogvenster "Globale variabelen" in het menu "Project" in MobileTogether Designer.

### XQuery {#xquery}

Tot nu toe hebben we voornamelijk over XPath gesproken, voornamelijk vanwege historische redenen, aangezien dit de bekendere XML-gebaseerde expressietaal is en al 15 jaar bestaat. Naast XPath ondersteunt MobileTogether echter ook de krachtigere XQuery-taal. XQuery is een ware uitbreiding van XPath, wat betekent dat elke geldige XPath-expressie ook een geldige XQuery-expressie is. XQuery voegt echter een aantal extra, krachtige functionaliteiten toe waarmee u veel meer kunt doen en waarmee u XML-documenten kunt manipuleren of direct kunt genereren.

### FLWOR-expressie

De belangrijkste XQuery-expressie is de zogenaamde FLWOR-expressie. FLWOR is een afkorting die staat voor "For-Let-Where-Order-Return" en wordt doorgaans uitgesproken als "flower". Functioneel is het equivalent van de SQL SELECT-statement, die vergelijkbare clausules heeft, zoals FROM, WHERE, ORDER BY, enz. De FLWOR-expressie stelt ons in staat om XML- en databasegegevens veel efficiënter en krachtiger te bevragen dan met eenvoudige XPath-expressies, en vormt de basis van XQuery.

We hebben al een deel van de expressie, namelijk het "for"-gedeelte, besproken in onze eerdere uitleg van XPath, dus dat deel van de FLWOR-expressie zal bekend in de oren klinken. Evenzo hebben we eerder al het "return"-gedeelte in dezelfde "for"-expressie gezien. Echter, XQuery vergroot de flexibiliteit van het "return"-gedeelte aanzienlijk doordat u hiermee complete XML-structuren vanaf nul kunt creëren met behulp van constructoren. In essentie wordt, net als voorheen, het "return"-gedeelte geëvalueerd voor elk item in de "for"-lus, maar in plaats van slechts één waarde in een reeks te produceren, kunt u nu een complete XML-substructuur opbouwen, zoals we in de volgende voorbeelden zullen zien.

Het doel van de `let`-clausule in een FLWOR-expressie is om extra variabelen te definiëren die we later kunnen gebruiken om ons resultaat op te bouwen. Deze variabelen kunnen afkomstig zijn uit dezelfde databron, of zelfs uit een andere databron. We kunnen bijvoorbeeld de loopvariabele gebruiken om bepaalde elementen uit de andere bron te selecteren.

Bijvoorbeeld, stel dat één databron informatie bevat over afdelingen binnen een organisatie, en een andere databron informatie bevat over medewerkers. Dit zou het begin kunnen zijn van een FLWOR-expressie die medewerkers selecteert uit een specifieke set afdelingen:

for$din$DEPARTMENTS/depts/deptnolet$e := $EMPLOYEES/emps/emp[deptno = $d]…De "where"-clausule stelt ons in staat om de data te filteren op basis van bepaalde criteria, vergelijkbaar met hoe we eerder predicaten hebben gebruikt in pure XPath-expressies. Bijvoorbeeld, we kunnen dit gebruiken om afdelingen te filteren op basis van het aantal werknemers dat ze hebben:

for$din$DEPARTMENTS/depts/deptnolet$e := $EMPLOYEES/emps/emp[deptno = $d]wherecount($e) >= 10…Ten slotte maakt de `order by`-clausule het mogelijk om het resultaat te sorteren op basis van elk gewenst criterium, wat vooral handig is bij het genereren van nieuwe XML-documenten.

Laten we nu de volledige FLWOR-expressie samenstellen, gebruikmakend van de eerder genoemde twee databronnen met afdelingen en medewerkers. Bijvoorbeeld, we kunnen een nieuwe datatabel genereren om weer te geven in een mobiele oplossing, die geaggregeerde informatie zou tonen over het aantal medewerkers en het gemiddelde salaris voor die afdelingen die meer dan 10 medewerkers hebben:

for$din$DEPARTMENTS/depts/deptnolet$e := $EMPLOYEES/emps/emp[deptno = $d]wherecount($e) >= 10order byavg($e/salary) descendingreturn<big-dept>   { $d,<headcount>{count($e)}</headcount>,<avgsal>{avg($e/salary)}</avgsal>   }</big-dept>In een ander voorbeeld, kunnen we voortbouwend op onze eerdere gegevens over mobiele facturen met gedetailleerde posten, nu meerdere facturen na een bepaalde datum doorlopen om hun totale bedragen te berekenen. Vervolgens kunnen we een tabel maken met de resultaten, gesorteerd van de factuur met het hoogste totaalbedrag tot de factuur met het laagste totaalbedrag, die we vervolgens kunnen weergeven

for$invin$DB1/sales/invoicelet$total := sum (for$xin item return$x/price * $x/quantity)where$inv/date >= "2014-01-01"order by$totaldescendingreturn<invtotal>{ $total }</invtotal>Zoals u kunt zien, is de flexibiliteit en kracht van deze XQuery-expressies veel groter dan wat we voorheen konden bereiken met alleen XPath. Echter, met meer kracht komt ook meer complexiteit, dus het kan even duren voordat u alle aspecten van XQuery onder de knie heeft.

Tegelijkertijd kan de ingebouwde XPath- en XQuery-bouwer en -evaluator in MobileTogether u aanzienlijk helpen bij het schrijven van correcte expressies en het testen ervan met uw gegevens. In combinatie met de krachtige simulator waarmee u uw mobiele apps direct in de MobileTogether Designer kunt uitvoeren, kunt u uw gegevensselectie via XPath en XQuery eenvoudig testen en debuggen, en zo veel krachtigere mobiele apps ontwikkelen dan met enige andere methode.

### Samenvatting

In dit document bieden we een eenvoudige introductie tot de belangrijkste concepten van XPath en XQuery, om u op weg te helpen met het werken met data in MobileTogether. We behandelen de basisprincipes van XPath-expressies en enkele van de krachtigere mogelijkheden van XQuery. Dit stelt u in staat om krachtige data-selecties te maken in uw mobiele workflow, nauwkeurige grafieken van uw data te genereren en de gebruikersinterface van uw mobiele oplossing aan te passen aan specifieke data-items, indien nodig.

Dit document is slechts een beginpunt en pretendeert geen complete handleiding te zijn of alle aspecten van deze talen uit te leggen. U kunt meer leren in onze uitgebreide, gratis online XPath-training, die geschikt is voor zowel beginners als gevorderde gebruikers.

MobileTogether ondersteunt de volledige XPath 3.0- en XQuery 3.0-talen. Het voordeel van het gebruik van een internationale standaard, zoals XPath en XQuery, is dat veel ontwikkelaars mogelijk in het verleden al XPath hebben geleerd toen ze werkten met XML, XSLT of XML-schema's. Het vermogen om die kennis in MobileTogether te hergebruiken, is dus een groot voordeel voor hen. En het bijwerken van uw kennis van XPath 1.0 of 2.0 naar 3.0 is een eenvoudig proces.

Daarnaast zijn XPath en XQuery standaarden die zijn ontwikkeld door de W3C, in plaats van propriëtaire talen die door één bedrijf zijn bedacht. Het leren van deze standaarden is daarom ook nuttig in andere contexten.

Voor de volledige specificatie van XPath 3.0 en XQuery 3.0, verwijzen wij u naar de volgende technische specificatiedocumenten:

- [XML Path Language (XPath) versie 3.0](http://www.w3.org/TR/2014/REC-xpath-30-20140408/)
- [XQuery 3.0: Een querytaal voor XML](http://www.w3.org/TR/2014/REC-xquery-30-20140408/)
- [XPath- en XQuery-functies en -operatoren, versie 3.0](http://www.w3.org/TR/2014/REC-xpath-functions-30-20140408/)
- [XQuery en XPath datamodel 3.0](http://www.w3.org/TR/2014/REC-xpath-datamodel-30-20140408/)

Tot slot, maar niet minder belangrijk, het gebruik van XPath en XQuery in MobileTogether betekent dat u eenvoudig XMLSpy kunt gebruiken om complexere XPath- en XQuery-expressies te prototypen, te ontwikkelen en te debuggen, indien nodig. XMLSpy biedt een complete XPath-evaluator en een XQuery-debugger, inclusief een profiler voor prestatieoptimalisatie.

Voor meer informatie over XPath 3.0 en XQuery 3.0, verwijzen wij u naar [de online trainingen](../training-tutorials.md) en documentatiepagina's van Altova. We bieden ook een XPath-referentie die alle [XPath-operatoren en -functies](../xpath-xquery-reference.md) uitlegt en voorbeelden geeft van hoe u deze kunt implementeren. U kunt ook XPath- en XQuery-gerelateerde vragen stellen in het MobileTogether-supportforum op [https://support.mobiletogether.com/](https://support.mobiletogether.com/)

