XML

XPath



Bevezetés

Az XPath egy olyan munka eredményeként jött létre, amelynek célja az volt, hogy az XSLT transzformációk és az XPointer által közösen használt funkciók számára egy közös szintaktikai és szemantikai alapot adjon. Ezen elsődleges cél megvalósítása mellett sztringek, számok és boolean értékek kezeléséhez is biztosítja a legalapvetőbb eszközöket. Az XPath tömör, nem XML alapú szintaxist használ, hogy ezáltal is megkönnyítse az XPath használatát az URI-kban és az XML attribútumok értékeiben. Az XPath az XML dokumentumok absztrakt, a logikai struktúra által leírt szintjén dolgozik, és nem az ezt elfedő szintaxison. Az XPath (magyarul X-út) név onnan ered, hogy az XML dokumentumok hierarchikus struktúrájának a bejárása során az URL-ekben az a bejárás útjának a leírására használjuk az XPath-t.

Azon felül, hogy címek megadására használható, az XPath-t úgy készítették el, hogy legyen egy olyan része, amit az illeszkedés vizsgálatára lehet használni (azaz arra, hogy teszteljük, hogy egy adott csomópont illeszkedik-e egy adott mintára). Az XPath-nak az illeszkedés vizsgálatára történő felhasználását az XSLT tárgyalja.

Az XPath nyelv csomópontokból képezett faként modellezi az XML dokumentumokat. A csomópontoknak különböző típusai vannak, beleértve az elemeknek megfelelő csomópontokat, az attribútumoknak megfelelő csomópontokat és a szövegrészeknek megfelelő csomópontokat. Az XPath definiál egy módszert, amelynek segítségével minden csomópont-típushoz ki lehet számolni egy sztringértéket. Bizonyos csomópontoknak neve is van. Az XPath teljes mértékben támogatja az (XML Nevek) XML névtereket. Éppen ezért a csomópontok neveit olyan párokkal lehet modellezni, amelyek egy lokális részből és egy névtér URI-ból állnak, ahol a névtér URI lehet null is. Ezeket a párokat hívjuk kiterjesztett neveknek.

Az XPath-ban a legfontosabb szintaktikai konstrukció a kifejezés. A kifejezések az Expr produkciós szabályra illeszkednek. A kifejezések kiértékelésekor egy objektumot kapunk, aminek a típusa a következő négy alaptípus egyikének felel meg:

  • csomóponthalmaz (csomópontok rendezés nélküli összessége, amelyben minden csomópont legfeljebb egyszer fordul elő)
  • boolean (igaz (true) vagy hamis (false))
  • szám (lebegőpontos szám)
  • sztring (karaktersorozat UCS karakterekből)

A kifejezések kiértékelése mindig valamilyen kontextusban, vagy más szóval környezetben történik. Az XSLT és az XPointer specifikálják, hogy ezt a környezetet hogyan kell meghatározni az XSLT-ben, illetve XPointerben használt XPath kifejezések esetén. A környezet a következő elemekből épül fel:

  • egy csomópont (a kontextus csomópontja)
  • egy nemnulla pozítiv egész számokból álló számpár (a kontextus pozíciója és a kontextus mérete)
  • egy változó-hozzárendeléseket tartalmazó halmaz
  • egy függvénykönyvtár
  • azoknak a névtérdeklarációknak a halmaza, amelyek hatókörében az adott kifejezés található

A kontextus pozíciója mindig kisebb vagy egyenlő, mint a kontextus mérete.

A változó-hozzárendelések változóneveket rendelnek hozzá változóértékekhez. A változó értéke olyan objektum, aminek a típusa megegyezik a kifejezés értékéhez rendelhető típusok valamelyikével, illetve ehhez az objektumhoz lehet itt nem specifikált típust is hozzárendelni.

A függvénykönyvtár függvényneveket képez le függvényekre. Minden függvény nulla, egy vagy több argumentummal rendelkezik, és minden függvénynek egyetlen visszatérési értéke van. Jelen dokumentum definiálja az alap (core) függvénykönyvtárat, amit minden XPath implementációnak támogatnia kell. A core függvénykönyvtárban található függvények argumentumainak és visszatérési értékének a típusa a négy alaptípusa egyike. Mind az XSLT, mind pedig az XPointer további függvényekkel bővíti az XPath-t, amelyek közül egyesek szintén csak a négy alaptípust használják, de ezek között már előfordulnak olyanok is, amelyek további, az XSLT, illetve az XPointer által használt típusokat használnak.

A névtérdeklarációk a prefixeket képezik le névtér-URI-kra.

A részkifejezések kiértékelésekor használt változó-hozzárendelések, függvénykönyvtár és névtérdeklarációk mindig megegyeznek a részkifejezést tartalmazó kifejezés kiértékelésekor használtakkal. A részkifejezések kiértékelésekor használt kontextuscsomópont, kontextuspozíció és kontextusméret időnként különbözhet a részkifejezést tartalmazó kifejezés kiértékelésekor használttal, mivel bizonyos kifejezéstípusok megváltoztatják a kontextuscsomópontot, illetve a predikátumok megváltoztatják a kontextuspozíciót és a kontextusméretet .Amikor egy kifejezéstípus kiértékelését megadjuk, mindig explicit módon jelezzük, ha a részkifejezések kiértékeléséhez használt kontextuscsomópont, kontextuspozíció vagy kontextusméret megváltozik. Ha nem mondunk semmit a kontextuscsomópontról, kontextuspozícióról, illetve kontextusméretről, akkor ezek változatlanok maradnak az adott kifejezés részkifejezéseinek kiértékelésekor.

Az XPath kifejezések gyakran XML attribútumokban fordulnak elő. Az itt specifikált nyelvtan azokra az attribútumértékekre vonatkozik, amelyeken már végrehajtottuk az XML 1.0 által definiált attribútum-normalizációt. Így például, ha a nyelvtan a < karaktert használja, akkor ez a karakter nem jelenhet meg az XML forrásban < karakterként, hanem az XML 1.0 szabályainak megfelelően helyettesíteni kell más karakterekkel, például a &lt; karaktersorozattal. A kifejezéseken belül a literális sztringeket egyszeres vagy dupla idézőjelek határolják, viszont ugyanezeket a karaktereket használjuk az XML attribútumok elejének és végének a jelzésére is. Ha el akarjuk kerülni, hogy a kifejezésben használt idézőjelet az XML processzor úgy értelmezze, hogy az az attribútum értékének a végét jelzi, akkor az idézőjelet megadhatjuk (&quot; vagy &apos;) karakterhivatkozással is. A másik lehetőség, hogy a kifejezés egyszeres idézőjelet használ, ha az XML attribútum dupla idézőjelet, és fordítva.

Az egyik fontos kifejezéstípus a lokalizáló út. A lokalizáló út a kontextus csomópontjához képest relatív módon meghatározza a csomópontok egy halmazát. A lokalizáló útként megadott kifejezés kiértékelésének eredménye a lokalizáló út által kiválasztott csomópontokat tartalmazó csomóponthalmaz. A lokalizáló utak rekurzív módon tartalmazhatnak olyan kifejezéseket, amelyeket ennek a csomóponthalmaznak további szűkítésére használhatunk. A lokalizáló utaknak a LocationPath produkciós szabályra kell illeszkedniük.

A következő nyelvtanban a QName és NCName nemterminálisok megegyeznek az [XML Nevek] által definiált megfelelő nemterminálisokkal, és a S nemterminális megegyezik a [XML] által definiált nemterminálissal. A nyelvtan ugyanazt az EBNF jelölést használja, mint az [XML] (kivéve, hogy a nyelvtan szimbólumai mindig nagybetűvel kezdődnek).

A kifejezéseket úgy elemezzük, hogy először a karaktersztringet tokenekre bontjuk, majd az így előálló tokensorozatot elemezzük. A tokenek között tetszőleges whitespace előfordulhat.

Lokalizáló utak

Jóllehet a lokalizáló utak nem a legáltalánosabb nyelvtani konstrukciók az XPath nyelvben, hiszen a LocationPath az Expr speciális esete, ezek a legfontosabb konstrukciók, ezért ezeket tárgyaljuk először.

A lokalizáló utakat magától értetődő, azonban inkább verbálisnak mondható formában lehet a legkönnyebben meghatározni. Szintaktikai rövidítések használatával lehetőség van arra is, hogy a legáltalánosabb eseteket tömören írjuk le. Ez az alfejezet a rövidítések alkalmazása nélkül magyarázza el a lokalizáló utak szemantikáját. A rövidített szintaxist azután a rövidítés nélküli szintaxisra történő feloldással definiáljuk.

Néhány példa a lokalizáló utak használatára a rövidítés nélküli szintaxissal:

  • child::para kiválasztja a kontextuscsomópont para elem típusú gyermekét

  • child::* kiválasztja a kontextuscsomópont összes elem típusú gyermekét

  • child::text() kiválasztja a kontextuscsomópont összes szövegrész típusú gyermekét

  • child::node() kiválasztja a kontextuscsomópont összes gyermekét típustól függetlenül

  • attribute::name kiválasztja a kontextuscsomópont name attribútumát

  • attribute::* kiválasztja a kontextuscsomópont összes attribútumát

  • descendant::para kiválasztja a kontextuscsomópont para elem típusú leszármazott csomópontját

  • ancestor::div kiválasztja a kontextuscsomópont összes div ősét

  • ancestor-or-self::div kiválasztja a kontextuscsomópont összes div ősét, és ha a kontextuscsomópont maga is egy div elem, akkor a kontextuscsomópontot magát is

  • descendant-or-self::para kiválasztja a kontextuscsomópont összes para elem típusú leszármazottját és, ha a kontextuscsomópont maga is egy para elem, akkor a kontextuscsomópontot magát is

  • self::para a kontextuscsomópontot magát, ha a kontextuscsomópont egy para elem, egyébként pedig nem választ ki semmit

  • child::chapter/descendant::para kiválasztja a kontextuscsomópont chapter elem típusú gyermekének a para elem típusú leszármazottjait

  • child::*/child::para kiválasztja a kontextuscsomópont para elem típusú unokáit

  • / kiválasztja a dokumentum gyökerét (ami mindig a dokumentumelem szülője)

  • /descendant::para kiválasztja a kontextuscsomóponttal azonos dokumentumban levő összes para elemet

  • /descendant::olist/child::item kiválasztja az összes olyan item elemtípusú csomópontot, aminek van egy olist szülője és a kontextuscsomóponttal azonos dokumentumban van

  • child::para[position()=1] kiválasztja a kontextuscsomópont első para gyermekét

  • child::para[position()=last()] kiválasztja a kontextuscsomópont utolsó para gyermekét

  • child::para[position()=last()-1] kiválasztja a kontextuscsomópont utolsó előtti para gyermekét

  • child::para[position()>1] kiválasztja a kontextuscsomópont összes para gyermekét az első para gyermek kivételével

  • following-sibling::chapter[position()=1] kiválasztja a kontextuscsomópont következő chapter testvérét

  • preceding-sibling::chapter[position()=1] kiválasztja a kontextuscsomópont előző chapter testvérét

  • /descendant::figure[position()=42] kiválasztja a dokumentum negyvenkettedik figure elem típusú csomópontját

  • /child::doc/child::chapter[position()=5]/child::section[position()=2] kiválasztja a doc dokumentumelem ötödik chapter elem típusú csomópontjának a második section elem típusú csomópontját.

  • child::para[attribute::type="warning"] kiválasztja a kontextuscsomópont összes olyan para gyermekét, amelynek van type attribútuma és ahol ennek az attribútumnak az értéke warning

  • child::para[attribute::type='warning'][position()=5] kiválasztja a kontextuscsomópont ötödik olyan para gyermekét, amelynek van type attribútuma és ahol ennek az attribútumnak az értéke warning

  • child::para[position()=5][attribute::type="warning"] kiválasztja a kontextuscsomópont ötödik para gyermekét, ha az ötödiknek van type attribútuma és az attribútum értéke warning

  • child::chapter[child::title='Introduction'] kiválasztja a kontextuscsomópont azon chapter gyermekeit, amelyeknek van legalább egy olyan title gyermeke, amelynek a sztringértéke Introduction

  • child::chapter[child::title] kiválasztja a kontextuscsomópont azon chapter gyermekeit, amelynek van legalább egy title gyermeke

  • child::*[self::chapter or self::appendix] kiválasztja a kontextuscsomópont chapter és appendix gyermekeit

  • child::*[self::chapter or self::appendix][position()=last()] kiválasztja a kontextuscsomópont utolsó chapter vagy appendix gyermekét

A lokalizáló utaknak két típusa van: a relatív lokalizáló utak és az abszolút lokalizáló utak.

A relatív lokalizáló utak egy vagy több, egymástól / karakterrel elválasztott lokalizáló lépésből állnak. A relatív lokalizáló útban megadott lépéseket balról jobbra haladva értelmezzük, és ebben minden egyes lépés valamely kontextuscsomóponthoz képest választ ki egy csomóponthalmazt. Ha már végrehajtottunk valahány lépést a relatív lokalizáló úton, akkor a rákövetkező lépést a következőképpen hajtjuk végre: A már végrehajtott lépések kiválasztottak egy csomóponthalmazt egy kontextuscsomóponthoz viszonyítva. Ennek a halmaznak minden csomópontját használjuk most fel mint kontextuscsomópontot a következő lépés végrehajtásánál. Az így adódó csomóponthalmazoknak vegyük az egyesítését. Ez az egyesített halmaz felel meg annak a relatív lokalizáló útnak, amit az így végrehajtott lépésekből áll össze. Például a child::div/child::para kiválasztja a kontextuscsomópont div elem típusú gyermekeinek a para elem típusú gyermekeit, vagy más szavakkal azon para elem típusú unokáit, amelyeknek div elem típusú szülője van.

Az abszolút lokalizáló út egy / karakterrel kezdődik, ami után opcionálisan egy relatív lokalizáló út állhat. Ha a / karakter magában áll, akkor az a kontextuscsomópontot tartalmazó dokumentum gyökérpontját választja ki. Ha pedig van van utána relatív lokalizáló út is, akkor az utána következő relatív lokalizáló út pedig azt a csomóponthalmazt választja ki, amit a kontextuscsomópontot tartalmazó dokumentum gyökérpontjához képest vett relatív lokalizáló út választana ki.

Lokalizáló utak
   LocationPath    ::=    RelativeLocationPath
| AbsoluteLocationPath
   AbsoluteLocationPath    ::=    '/' RelativeLocationPath
| AbbreviatedAbsoluteLocationPath
   RelativeLocationPath    ::=    Step
| RelativeLocationPath '/' Step
| AbbreviatedRelativeLocationPath

Lokalizáló lépések

A lokalizáló lépések három részből állnak:

  • egy tengelyből, ami a lokalizáló lépés által kiválasztott csomópontok és a kontextuscsomópont közötti kapcsolat típusát határozza meg a fában,

  • egy csomóponttesztből, ami meghatározza a csomópont típusát és a lokalizáló lépés által kiválasztott csomóponthalmaz nevét kiterjesztett nevét, illetve

  • nulla, egy vagy több predikátumból, amelyek tetszőleges kifejezések használatával tovább pontosíthatják a lokalizáló lépés által kiválasztott csomópontok halmazát.

A lokalizáló lépés szintaxisa a tengely nevéből és a csomóponttesztből áll, amelyet két kettőspont választ el egymástól. Ezután nulla, egy vagy több kifejezés következhet, ahol a kifejezéseket szögletes zárójelben adjuk meg, külön-külön zárójelezve minden egyes kifejezést. A child::para[position()=1] példában a child a tengely neve, a para a csomópontteszt és a [position()=1] a predikátum.

A lokalizáló lépés által kiválasztott csomóponthalmaz az a csomóponthalmaz, amit úgy kapunk meg, hogy a tengelyből és a csomóponttesztből képezett kiindulási csomóponthalmazt tovább szűkítjük a predikátumoknak megfelelően, azokat egymás után alkalmazva.

A kiindulási csomóponthalmaz azokból a csomópontokból áll, amelyek a kontextuscsomóponttal a tengely által meghatározott relációban vannak, és amelyeknek a típusa megfelel a csomópontteszt által meghatározott kiterjesztett névnek. Például a descendant::para lokalizáló lépés a kontextuscsomópont para elem típusú leszármazottait választja ki: a descendant mondja meg, hogy a kiindulási csomóponthalmazban minden csomópontnak a kontextus leszármazottjának kell lennie, a para határozza meg, hogy a kiindulási csomóponthalmazban minden csomópontnak para nevű, elem típusú csomópontnak kell lennie.

A kiindulási csomóponthalmazt először az első predikátumnak megfelelően szűkítjük, majd az így előálló új csomóponthalmazt a második predikátumnak megfelelően tovább szűkítjük, és így tovább. Az eljárás végén kapott csomóponthalmaz lesz a lokalizáló lépés által kiválasztott csomóponthalmaz.

Lokalizáló lépések
   Step    ::=    AxisSpecifier NodeTest Predicate*
| AbbreviatedStep
    AxisSpecifier    ::=    AxisName '::'
| AbbreviatedAxisSpecifier

Tengelyek

A következő tengelyeket használhatjuk:

  • a child (gyermek) tengely tartalmazza a kontextuscsomópont gyermekeit

  • a descendant (leszármazott) tengely tartalmazza a kontextuscsomópont leszármazottait, ahol leszármazott alatt értjük a gyermeket, a gyermek gyermekét, és így tovább, ezért a leszármazott tengely sohasem tartamaz attribútum típusú vagy névtér típusú csomópontot.

  • a parent (szülő) tengely a kontextuscsomópont szülőjét tartalmazza, ha létezik szülője a kontextuscsomópontnak

  • az ancestor (ős) tengely a kontextuscsomópont őseit tartalmazza, ahol a kontextuscsomópont ősei alatt értjük a kontextuscsomópont szülőjét, a szülőjének a szülőjét, és így tovább, ezért a ős tengely mindig tartalmazza a gyökérpontot, ha a kontextuscsomópont nem maga a gyökérpont volt

  • a following-sibling (következő testvér) tengely a kontextuscsomópont összes olyan testvérét tartalmazza, ami a kontextuscsomópont után áll a fában. Ha a kontextuscsomópont attribútum típusú vagy névtér típusú csomópont, akkor a following-sibling tengely üres halmazt eredményez

  • a preceding-sibling (előző testvér) tengely a kontextuscsomópont összes olyan testvérét tartalmazza, ami a kontextuscsomópont előtt áll a fában. Ha a kontextuscsomópont attribútum típusú vagy névtér típusú csomópont, akkor a preceding-sibling tengely üres halmazt eredményez

  • a following (következő) tengely az összes olyan csomópontot tartalmazza, ami a kontextuscsomóponttal azonos dokumentumban van és ami a kontextuscsomópont után áll a fában, kivéve a leszármazott csomópontjait a kontextuscsomópontnak és az attribútum típusú és névtér típusú csomópontokat

  • a preceding (előző) tengely az összes olyan csomópontot tartalmazza, ami a kontextuscsomóponttal azonos dokumentumban van és ami a kontextuscsomópont előtt áll a fában, kivéve az őseit a kontextuscsomópontnak és az attribútum típusú és névtér típusú csomópontokat

  • az attribute (attribútum) tengely a kontextuscsomópont attribútumait tartalmazza. Ha a kontextuscsomópont nem elem típusú csomópont, akkor ez a tengely üres halmazt eredményez

  • a namespace (névtér) tengely a kontextuscsomópont névtér típusú csomópontjait tartalmazza. Ha a kontextuscsomópont nem elem típusú csomópont, akkor ez a tengely üres halmazt eredményez

  • a self (saját) tengely magát a kontextuscsomópontot tartalmazza

  • a descendant-or-self (leszármazott vagy saját) tengely a kontextuscsomópontot és a kontextuscsomópont leszármazottait tartalmazza

  • a ancestor-or-self (ős vagy saját) tengely a kontextuscsomópontot és a kontextuscsomópont őseit tartalmazza, ezért ez a tengely mindig tartalmazza a gyökérpontot

MEGJEGYZÉS: Az ancestor, descendant, following, preceding és self tengelyek a dokumentum csomópontjainak osztályozását adják meg (ha figyelmen kívül hagyjuk az attribútum típusú és a névtér típusú csomópontokat), hiszen az így meghatározott halmazoknak nincs közös eleme és az egyesítésük a dokumentum összes csomópontját tartalmazza.
Tengelyek
  AxisName    ::=    'ancestor'
| 'ancestor-or-self'
| 'attribute'
| 'child'
| 'descendant'
| 'descendant-or-self'
| 'following'
| 'following-sibling'
| 'namespace'
| 'parent'
| 'preceding'
| 'preceding-sibling'
| 'self'

Csomóponttesztek

Minden tengelyhez hozzá van rendelve egy elsődleges csomóponttípus. Ha a tengely tartalmazhat elem típusú csomópontokat, akkor a tengely elsődleges csomóponttípusa az elem típus, egyébként pedig azoknak a csomópontoknak a típusával egyezik meg, amelyeket a tengely tartalmazhat. Ezért

  • attribute tengely esetén az elsődleges csomóponttípus az attribútum típus,
  • namespace tengely esetén az elsődleges csomóponttípus a névtér típus, illetve
  • minden más tengely esetén az elsődleges csomóponttípus az elem típus.

Azok a csomóponttesztek, amelyek egyetlen QName-ből állnak akkor és csak akkor teljesülnek, ha a csomópont típusa megegyezik az elsődleges csomóponttípussal és a csomópont kiterjesztett neve megegyezik a QName által meghatározott kiterjesztett névvel. Például a child::para kiválasztja kontextuscsomópont para elem típusú gyermekeit. Ha a kontextuscsomópontnak nincs para gyermeke, akkor a kiválasztott csomóponthalmaz az üres halmaz lesz. Az attribute::href csomópontteszt a kontextuscsomópont href attribútumát választja ki. Ha a kontextuscsomópontnak nincs href attribútuma, akkor a kiválasztott csomóponthalmaz az üres halmaz lesz.

A csomóponttesztekben szereplő QName neveket a kifejezés kontextusából vett névtérdeklarációk használatával alakítjuk át kiterjesztett neveekké. Ez a módszer megegyezik azzal az eljárással, amit az elem típusú nevek start-tagjeiben és end-tagjeiben használtunk, eltekintve attól, hogy az xmlns használatával deklarált alapértelmezett névtereket itt nem használjuk: Ha QName névnek nincs prefixe, akkor a névtér URI-ja null (ugyanúgy, ahogy az attribútumnevek esetében történt). Hibának számít, ha QName névnek olyan prefixe van, amihez a kifejezés kontextusában nem található névtérdeklaráció.

A * csomópontteszt teljesül minden olyan csomópontra, aminek a típusa megegyezik az elsődleges csomóponttípussal. Például a child::* csomópontteszt kiválasztja a kontextuscsomópont összes elem típusú gyermekét, a attribute::* csomópontteszt pedig kiválasztja a kontextuscsomópont összes attribútumát.

A csomóponttesztek NCName:* formában is megadhatóak. Ebben az esetben a prefixet a kontextus névtérdeklarációinak használatával ugyanúgy oldjuk fel, ahogy QName nevek esetében tettük. Hibának számít, ha a kifejezés kontextusában az adott prefixhez nincs megfelelő névtérdeklaráció. A csomópontteszt ebben az esetben teljesül minden olyan csomópontra, amelynek a típusa megegyezik az elsődleges csomóponttípussal és a kiterjesztett nevének ugyanaz az névtér URI-ja, amire a prefixet feloldottuk, függetlenül a név lokális részétől.

A text() csomópontteszt tetszőleges szövegrész típusú csomópontra teljesül. Például a child::text() csomópontteszt a kontextuscsomópont összes szövegrész típusú gyermekét kiválasztja. Hasonlóan a comment() csomópontteszt tetszőleges megjegyzés típusú csomópontra teljesül, és a processing-instruction() csomópontteszt tetszőleges feldolgozó utasítás típusú csomópontra teljesül. A processing-instruction() tesztnek lehet egy literál típusú argumentuma is. Ebben az esetben a teszt azokra a feldolgozó utasításokra teljesül, amelyeknek a neve megegyezik a literál által megadott értékkel.

A node() csomópontteszt minden csomópontra igaz a csomópont típusától függetlenül.

    NodeTest    ::=    NameTest
| NodeType '(' ')'
| 'processing-instruction' '(' Literal ')'

Predikátumok

A tengelyek vagy előre haladó vagy fordított irányú tengelyek. Azokat a tengelyeket nevezzük előre haladó tengelyeknek, amelyek csak kontextuscsomópontot és a dokumentum rendezésében a kontextuscsomópont után álló csomópontokat tartalmazzák. Azokat a tengelyeket pedig, amelyek csak kontextuscsomópontot és a dokumentum rendezésében a kontextuscsomópont előtt álló csomópontokat tartalmaznak, fordított irányú tengelyeknek hívjuk. Ebből következően az ancestor, ancestor-or-self, preceding és preceding-sibling tengelyek fordított irányú tengelyek, minden más tengely pedig előre haladó tengely. Mivel a self tengely legfeljebb egy csomópontot tartalmazhat, ezért nem számít, hogy előre haladó vagy fordított irányú tengelyként kezeljük-e. A csomóponthalmazok elemeinek szomszédsági pozícióját a tengely figyelembevételével a következőképpen definiáljuk: ha a tengely előre haladó tengely, akkor a szomszédsági pozíció a dokumentum rendezése szerint rendezett csomóponthalmazban vett pozíció, ha pedig a tengely fordított irányú tengely, akkor a szomszédsági pozíció a dokumentum rendezésének a fordítottja szerint rendezett csomóponthalmazban vett pozíció. Az első pozíció az 1.

A predikátumok a csomóponthalmazokra a tengely figyelembevételével megszorításokat tesznek, és ezáltal új, szűkített csomóponthalmazt hoznak létre. A szűkítendő csomóponthalmaz minden egyes csomópontjára kiértékelődik a PredicateExpr predikátum úgy, hogy a kiértékelés során az adott csomópont lesz a kontextuscsomópont, a csomóponthalmazban lévő csomópontok száma lesz a kontextus mérete, és a csomóponthalmazban a csomópontnak a tengely figyelembevételével számolt szomszédsági pozíciója lesz a kontextus pozíciója. Az adott csomópont akkor és csak akkor kerül be az új, szűkített csomóponthalmazba, ha az adott csomópontra a PredicateExpr predikátum teljesül.

A PredicateExpr predikátum úgy kerül kiértékelésre, hogy kiértékeljük az Expr kifejezést, majd az eredményt boolean típusúra konvertáljuk. Ha az eredmény szám, akkor az eredmény akkor és csak akkor lesz igaz, ha az eredményként kapott szám megegyezik a kontextus pozíciójával. Ha az eredmény nem szám, akkor az eredmény úgy lesz konvertálva, ahogy a boolean függvényhívás konvertálná. Ennek következtében a para[3] lokalizáló út ekvivalens a para[position()=3] lokalizáló úttal.

Predikátumok
  Predicate    ::=    '[' PredicateExpr ']'
    PredicateExpr    ::=    Expr

Rövidített szintaxis

Néhány példa a rövidített szintaxist használó lokalizáló utakra:

  • para kiválasztja a kontextuscsomópont para elem típusú gyermekeit

  • * kiválasztja a kontextuscsomópont összes elem típusú gyermekét

  • text() kiválasztja a kontextuscsomópont összes szövegrész típusú gyermekét

  • @name kiválasztja a kontextuscsomópont name attribútum típusú gyermekét

  • @* kiválasztja a kontextuscsomópont összes attribútum típusú gyermekét

  • para[1] kiválasztja a kontextuscsomópont első para gyermekét

  • para[last()] kiválasztja a kontextuscsomópont utolsó para gyermekét

  • */para kiválasztja a kontextuscsomópont összes para unokáját

  • /doc/chapter[5]/section[2] kiválasztja a doc ötödik chapter gyermekének a második section gyermekét

  • chapter//para kiválasztja a kontextuscsomópont chapter elem típusú gyermekeinek az összes para elem típusú leszármazottját

  • //para kiválasztja a dokumentum gyökerének összes para leszármazottját, azaz a kontextuscsomóponttal azonos dokumentumban levő összes para elemet

  • //olist/item kiválasztja a kontextuscsomóponttal azonos dokumentumbal levő item elemek közül azokat, amelyek szülője olist

  • . kiválasztja magát a kontextuscsomópontot

  • .//para kiválasztja a kontextuscsomópont para elem típusú leszármazottait

  • .. kiválasztja a kontextuscsomópont szülőjét

  • ../@lang kiválasztja a kontextuscsomópont szülőjének a lang attribútumát

  • para[@type="warning"] kiválasztja a kontextuscsomópont minden olyan para gyermekét, aminek van olyan type attribútuma, amelynek az értéke warning

  • para[@type="warning"][5] kiválasztja a kontextuscsomópont ötödik olyan para gyermekét, aminek van olyan type attribútuma, amelynek az értéke warning

  • para[5][@type="warning"] kiválasztja a kontextuscsomópont ötödik para gyermekét, ha ennek a gyermeknek van olyan type attribútuma, amelynek az értéke warning

  • chapter[title="Introduction"] kiválasztja a kontextuscsomópont összes olyan chapter gyermekét, aminek van egy vagy több olyan title elem típusú gyermeke, amelynek a sztringértéke Introduction

  • chapter[title] kiválasztja a kontextuscsomópont összes olyan chapter gyermekét, aminek van egy vagy több olyan title elem típusú gyermeke

  • employee[@secretary and @assistant] kiválasztja a kontextuscsomópont összes olyan employee elem típusú gyermekét, amelynek van secretary attribútuma és assistant attribútuma is

A legfontosabb rövidítés az az, hogy a child:: elhagyható a lokalizáló lépésekből. Valójában a child az alapértelmezett tengely. Például a div/para lokalizáló út a child::div/child::para rövidítése.

Az attribútumokhoz is van rövidítés: az attribute:: helyett a @ rövidítés írható. Például a para[@type="warning"] lokalizáló út a child::para[attribute::type="warning"] lokalizáló út rövidítéseként használható, és így kiválasztja azokat a para elem típusú gyermekeket, amelyeknek van olyan type attribútuma, aminek az értéke warning.

A // a /descendant-or-self::node()/ rövidítése. Például a //para a /descendant-or-self::node()/child::para rövidítése, és így ki fog választani minden para elemet a dokumentumban (még az a para elem is ki lesz választva a //para által, ami maga a dokumentumelem, mivel a dokumentumelem csomópontja a gyökércsomópont gyermeke). A div//para a child::div/descendant-or-self::node()/child::para rövidítése, és így ki fogja választani a div gyermekeinek minden para leszármazottját.

MEGJEGYZÉS: A //para[1] lokalizáló út jelentése nem egyezik meg a /descendant::para[1] lokalizáló út jelentésével. Az utóbbi az első para elem típusú leszármazottat választja ki, az előbbi az összes olyan para elem típusú leszármazottat, ami a saját szülőjének első para gyermeke.

A . lokalizáló lépés a self::node() rövidítése. Ez a rövidítés különösen akkor hasznos, ha a // rövidítéssel együtt használjuk. Például a .//para lokalizáló út a

self::node()/descendant-or-self::node()/child::para

rövidítése, és így a kontextuscsomópont összes para leszármazottját fogja kiválasztani.

Hasonlóan a .. lokalizáló lépés a parent::node() rövidítése. Például a ../title lesz a parent::node()/child::title rövidítése, és így a kontextuscsomópont szülőjének az összes title gyermekét fogja kiválasztani.

Rövidítések
    AbbreviatedAbsoluteLocationPath    ::=    '//' RelativeLocationPath
    AbbreviatedRelativeLocationPath    ::=    RelativeLocationPath '//' Step
    AbbreviatedStep    ::=    '.'
| '..'
   AbbreviatedAxisSpecifier    ::=    '@'?

Megfelelés a specifikációnak

Az XPath elsődleges célja, hogy más specifikációkban fel lehessen használni, hivatkozni lehessen rá, ezért az XPath nem határoz meg kritériumokat arra vonatkozóan, hogyan kell az XPath implementációinak megfelelni a jelen specifikációnak, hanem az XPath-t felhasználó specifikációkra (mint amilyen az XPointer és az XSLT) hagyja annak meghatározását, hogy az implementációknak milyen feltételeknek kell megfelelniük, hogy szabványosak legyenek. Az XPath azon implementációk számára nem ad meg ilyen feltételeket, amelyek más specifikációtól nem függenek.