XPath voor beginners HVA-IAM-V1-TDI Internetstandaarden 2 2008/2009 Fons van Kesteren
1
Inhoud Inleiding.................................................................................................................... 3 XPath paden .............................................................................................................. 4 Absoluut pad ......................................................................................................... 4 Relatief pad ........................................................................................................... 4 Eenvoudige stappen................................................................................................... 5 Element ................................................................................................................. 5 Attribuut................................................................................................................ 5 Alle kinderen/attributen ......................................................................................... 5 Één stap omhoog ................................................................................................... 5 Alle onderliggende elementen ............................................................................... 5 Stap op de plaats.................................................................................................... 6 Andere nodes ( tekst, commentaar, processing-instruction).................................... 6 Voorwaarden............................................................................................................. 7 Aanwezigheid van nodes ....................................................................................... 7 Waarden van nodes................................................................................................ 7 Positie van een element ......................................................................................... 7 XPath functies ........................................................................................................... 8 string-functies........................................................................................................ 8 nummer-functies.................................................................................................... 8 XPath-assen .............................................................................................................. 9 De assen ................................................................................................................ 9 Lange vs korte notatie............................................................................................ 9
2
Inleiding Basiskennis van XPath. Inleiding XPath, voor meer informatie raadplege men een reference. Alle voorbeelden die in deze tutorial worden gebruikt kunnen worden toegepast op onderstaand XML bestand. <artikel datum="2008-11-01" bron="HVA krant" >
Blok 2 begint <samenvatting> 2 van het tweede jaar 'interactive media' is begonnen.
enthousiasme is men aan het nieuwe blok begonnen. blok begon met een gezellige knutselopdracht om de stemming er goed in te krijgen. De docent zegt: zet hem op jongen. En toen was het begonnen. Maar niet zonder de toverspreuk Waar de dieren zich aan de drinkplaats laven, laven de mensen zich aan een goed gesprek over de dieren. uit te spreken. Nieuwe laptops gratis weggegeven. Blok 1 met succes afgerond.
3
XPath paden Een Xpath expressie is een beschrijving van een pad door een XML structuur naar nul, één of meer punten in de XML boom. Zo’n pad bestaat uit stappen, die ieder gescheiden worden door een (slash ( ‘/ ‘ ). Enkele voorbeelden: /artikel/titel /artikel/@datum alinea/citaat
Bovenstaande paden beschrijven dus een pad door een XML structuur. Een pad bestaat uit één of meer stappen. De stappen worden gescheiden door een slash ( ‘/’). Bij iedere stap wordt er een volgend element of attribuut geselecteerd. Er zijn twee soorten paden: absolute paden en relatieve paden. Absoluut pad Een absoluut pad begint altijd met een slash ( ‘/ ‘) waarmee wordt aangegeven dat het pad vanaf helemaal bovenaan in de XML boomstructuur moet worden gevolgd. Bijvoorbeeld: /artikel/titel /artikel/@datum
Relatief pad Een relatief pad begint zonder slash (‘/’) en moet worden gevolgd vanaf de ‘contextnode’ waar het pad wordt aangeroepen. Wat de context-node is hangt dus helemaal af van de plek waar de xpath-expressie wordt gebruikt. Bijvoorbeeld in een xls:for-each loop <xsl:for-each select="/artikel/gerelateerde_artikelen/gerelateerd_artikel "> <xsl:value-of select="titel"/> (zie: <xsl:value-of select="@url"/>)
Alle select-paden in de xsl:value-of elementen zijn relatief ten opzichte van het gerelateerde_artikel element die in de xsl:for-each loop geselecteerd wordt.
4
Eenvoudige stappen Er kan op zeer veel manieren een stap gemaakt worden in XPath, en soms kan dat op een ingewikkelde manier. In verreweg de meeste gevallen zijn de stappen echter eenvoudig. In dit hoofdstuk zullen de eenvoudige en meest gebruikte stappen worden besproken. Verreweg de meeste stappen zijn selecties van element of attributen. Deze stappen zijn dan ook eenvoudig te maken. Element Een element wordt geselecteerd met de naam van het element. Bijvoorbeeld: /artikel/titel
Hierin wordt de eerste stap gezet van bovenin de xml structuur naar het eerste element met de naam ‘artikel’, vervolgens wordt een stap gezet naar het daaronder liggende element met de naam ‘titel’. Attribuut Een attribuut kan worden geselecteerd met een @ gevolgd door de naam van het attribuut. Bijvoorbeeld: /artikel/@datum
Hierin wordt eerst het artikel-element geselecteerd en daarna het datum-attribuut. Alle kinderen/attributen Alle elementen of attributen worden geselecteerd met een wildchar ( ‘*’ ) . Bijvoorbeeld: /artikel/* /artikel/@*
In het eerste voorbeeld worden alle elementen onder artikel geselecteerd. In het tweede voorbeeld worden alle attributen van artikel geselecteerd. Één stap omhoog Soms wil je een stap omhoog doen. In dat geval gebruik je twee punten ( ‘..’ ). Bijvoorbeeld: ../@datum
Hier wordt het datum-attribuut van het bovengelegen element geselecteerd. Alle onderliggende elementen Soms wil je alle elementen in de onderliggende boom structuur selecteren. Daarvoor wordt de dubbele slash ( ‘//’) gebruikt. Bijvoorbeeld. //citaat
5
Hier mee worden in één keer alle citaat-elementen in de gehele onderliggende boomstructuur geselecteerd. Stap op de plaats Het is ook mogelijk om een pas op de plaats te doen. Dan wordt een enkele punt (‘.’) gebruikt. .
Dit lijkt misschien een beetje overbodig, maar bijvoorbeeld in een xsl:for-each loop kan dat wel degelijk zinvol zijn.
citatenlijst <xsl:for-each select=”//citaat”> - <xsl:value-of select=”.”/>
In dit voorbeeld worden de waarden van alle telefoonnummer-elementen in een lijstje geplaatst. Andere nodes ( tekst, commentaar, processing-instruction) Behalve elementen en attributen kunnen ook andere ‘naamloze’ nodes geselecteert worden. Tekst, commentaar en processing-instructions hebben geen naam en kunnen daarom alleen met speciale functies worden geselcteerd. text() comment() processing-instruction()
Daarnaast is er nog één functie die alle nodes van ieder type selecteerd: node()
6
Voorwaarden In alle bovenstaande voorbeelden worden elementen en attributen geselecteerd op basis van de naam van het element of het attribuut. Er kunnen echter nog andere voorwaarden gesteld worden aan de selecties. Deze voorwaarden staan tussen rechte haken achter de naam van het element of attribuut: artikel [voorwaarde ] . Hieronder worden enkele veelgebruikte voorwaarden beschreven. Aanwezigheid van nodes Een element kan geselecteerd worden op basis van de aanwezigheid van een andere node in de xml structuur. alinea [ citaat ]
Dit voorbeeld selecteert de alinea’s waar een citaat in voorkomt. citaat [ @geciteerde ]
Dit voorbeeld selecteert de citaat-element met een geciteerde-attribuut. Waarden van nodes Er kan natuurlijk ook geselecteerd worden op de waarde van een element of attribuut. artikel [ @datum = ‘2008-01-01’ ]
Dit selecteert artikel’s van een bepaalde datum. alinea [ /citaat / geciteerde=’jochem’ ]
Dit selecteert de alinea’s met een citaat van ‘jochem’ . Positie van een element Een veelgebruikte voorwaarde is de positie van een element in een lijst. Bijvoorbeeld het eerste of het laatste alinea. alinea [ 1 ] alinea [ last() ]
7
XPath functies Behalve het selecteren van nodes, is het ook mogelijk om berekeningen of manipulaties van gegevens te doen. Hier voor zijn er een aantal functies beschikbaar. Hieronder worden er enkele genoemd. Raadpleeg een XPath reference voor meer functies. string-functies Bijvoorbeeld: contains(string , substring ) : true als de string substring bevat, anders false normalize-space(string) : verwijdert alle overbodige spaties, tabs en returns
nummer-functies Bijvoorbeeld: round( getal )
: doet een afronding
8
XPath-assen In voorgaand hoofdstuk over eenvoudige stappen is beschreven hoe de meest gebruikte stappen gezet kunnen worden in een XPath. Hoewel dit wel de meeste gebruikelijk stappen zijn is het maar een klein deel van de mogelijke stappen. Er kunnen stappen gezet worden in alle mogelijk richtingen van de XML boom structuur: omlaag, omhoog, opzij. Deze richten worden ‘assen genoemd. Voor de meer ongebruikelijke stappen is een andere, lange notatie vereist. De assen Er kunnen stappen gezet worden in vele richtingen. de volgende assen zijn we al tegen gekomen: child direct onderliggende elementen attribute attributen parent bovenliggende element self stap op de plaats Behalve deze basis-assen zijn er nog een paar assen waarmee grotere stappen genomen kunnen worden descendent alle onderliggende elementen ancestor alle bovenliggende elementen sibling alle elementen op hetzelfde niveau preceding-sibling alle elementen op hetzelfde niveau voor de context following-sibling alle elementen op hetzelfde niveau na de context Lange vs korte notatie Om de stappen op al deze assen te kunnen maken is er een lange, volledige notatie. Deze notatie bestaat uit de naam van de as, gevolgd door de naam van het te selecteren element of attribute. Tussen de naam van de as en de naam van het element of attribuut staan twee dubbele punten ( ‘::’ ) .De notatie voor eenvoudige stappen is in feite een shortcut voor de lange notatie. In onderstaande tabel worden de lange en korte notatie vergeleken. Merk op dat er lang niet voor alle mogelijke paden een verkorte notatie is. Lang
Kort
child::artikel
artikel
Beschrijving elementen met de naam ‘artikel’
child::*
*
alle elementen
attribute::datum
@datum
attribuut met de naam ‘datum’
attribute::*
@*
alle attributen
parent::artikel parent::* self::artikel
..
bovenliggend element met de naam ‘artikel het bovenliggende element, ongeacht de naam. pas op de plaats, mits de plaats ‘artikel’ is 9
self::*
.
pas op de plaats
descendent::alinea
//alinea
descendent::*
//*
elementen eronder met de naam ‘alinea’ elementen eronder
sibling::alinea sibling::* preceding-sibling:: alinea preceding-sibling::* following-sibling:: alinea following-sibling::*
elementen met de naam ‘alinea’ op hetzelfde niveau elementen op hetzelfde niveau voorgaande elementen met de naam ‘alinea’ op hetzelfde niveau voorgaande elementen op hetzelfde niveau volgende elementen met de naam ‘alinea’ op hetzelfde niveau volgende elementen op hetzelfde niveau
10