XML Path Language (XPath)
Version 1.0

W3C Recommendation 16 November 1999

Magyar fordítás

2005. február

Jelen verzió:
http://mgl.uw.hu/XMLPath/xpath.html
Fordító:
Máté Gábor, gabor.lajos.mate@gmail.com <gabor.lajos.mate@gmail.com>

Jelen dokumentum egy W3C-dokumentum fordítása. Mind az eredeti dokumentum, mind pedig a fordítás szerzői jogi védelem alatt áll. Az eredeti dokumentum szerzői jogára vonatkozóan lásd az angol nyelvű copyright megjegyzést. A fordítás nem minősül normatív dokumentumnak. A dokumentum egyetlen normatív verziója az angol nyelvű verzió.

A fordításban talált esetleges hibákat, illetve a fordítással kapcsolatos javaslatokat a fordító fent megadott elérhetőségén lehet jelezni.


XML Path nyelv (XPath)
W3C

XML Path nyelv (XPath)
1.0 verzió

W3C ajánlás 1999. november 16.

Jelen verzió:
http://www.w3.org/TR/1999/REC-xpath-19991116
(XML vagy HTML formátumban)
Legutolsó verzió:
http://www.w3.org/TR/xpath
Előző verziók:
http://www.w3.org/TR/1999/PR-xpath-19991008
http://www.w3.org/1999/08/WD-xpath-19990813
http://www.w3.org/1999/07/WD-xpath-19990709
http://www.w3.org/TR/1999/WD-xslt-19990421
Szerkesztők:
James Clark <jjc@jclark.com>
Steve DeRose (Inso Corp. és Brown University) <Steven_DeRose@Brown.edu>

Absztrakt

Az XPath nyelv célja, hogy az XML dokumentumok bizonyos részeit meg lehessen címezni úgy, hogy mind az XSLT, mind pedig az XPointer specifikációk használni tudják.

A dokumentum státusza

Ezt a dokumentumot a W3C tagjai, valamint egyéb érdekelt felek is ellenőrizték, és a director támogatta a W3C ajánlásként való elfogadását. Ez egy stabil, már nem változó dokumentum, amit referenciaanyagként is lehet használni, vagy más dokumentumban normatív hivatkozásként is meg lehet adni. A W3C szerepe az ajánlás létrehozásában az, hogy felhívja a figyelmet a specifikációra és elősegítse a széleskörű elfogadottságát, ezáltal növelve a Web funkcionalitását és interoperabilitását.

A specifikációban talált hibák listája a http://www.w3.org/1999/11/REC-xpath-19991116-errata címen érhető el.

A specifikációval kapcsolatos megjegyzéseket a www-xpath-comments@w3.org címre lehet elküldeni, az ide érkezett megjegyzések archívuma is hozzáférhető.

Jelen specifikáció angol nyelvű változata az egyetlen normatív változat, mindazonáltal ha a specifikáció valamely fordítása érdekelne bennünket, akkor látogassuk meg a http://www.w3.org/Style/XSL/translations.html oldalt.

A W3C-ajánlások és más technikai dokumentumok aktuális listája a http://www.w3.org/TR címen található.

Jelen specifikáció az XSL Working Group és az XML Linking Working Group közös munkájának az eredménye, és így mind a W3C Style activity, mind pedig a W3C XML activity része.

Tartalomjegyzék

1 Bevezetés
2 Lokalizáló utak
    2.1 Lokalizáló lépések
    2.2 Tengelyek
    2.3 Csomóponttesztek
    2.4 Predikátumok
    2.5 Rövidített szintaxis
3 Kifejezések
    3.1 Alapvető fogalmak
    3.2 Függvényhívások
    3.3 Csomóponthalmazok
    3.4 Booleanek
    3.5 Számok
    3.6 Sztringek
    3.7 Lexikális felépítés
4 A Core függvénykönyvtár
    4.1 Csomóponthalmaz-függvények
    4.2 Sztring függvények
    4.3 Boolean függvények
    4.4 Numerikus függvények
5 Adatmodell
    5.1 Gyökércsomópont
    5.2 Elem típusú csomópontok
        5.2.1 Egyedi ID-k
    5.3 Attribútum típusú csomópontok
    5.4 Névtér típusú csomópontok
    5.5 Feldolgozó utasítás típusú csomópontok
    5.6 Megjegyzés típusú csomópontok
    5.7 Szövegrész típusú csomópontok
6 Megfelelés a specifikációnak

Függelék

A Hivatkozások
    A.1 Normatív hivatkozások
    A.2 Egyéb hivatkozások
B XML Information Set Mapping (Non-Normative)

1 Bevezetés

Az XPath egy olyan munka eredményeként jött létre, amelynek célja az volt, hogy az [XSLT] XSLT transzformációk és az [XPointer] 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. Ezt az adatmodellt részletesen az [5 Adatmodell] rész tárgyalja.

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:

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:

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. (Lásd: [4 Core függvénykönyvtár]). 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 (lásd: [2.4 Predikátumok]). 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. A tokenekre bontás folyamatát a [3.7 Lexikai struktúra] tárgyalja.

2 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. (Lásd: [2.5 Rövidített szintaxis].)

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

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
[1]   LocationPath   ::=   RelativeLocationPath
| AbsoluteLocationPath
[2]   AbsoluteLocationPath   ::=   '/' RelativeLocationPath?
| AbbreviatedAbsoluteLocationPath
[3]   RelativeLocationPath   ::=   Step
| RelativeLocationPath '/' Step
| AbbreviatedRelativeLocationPath

2.1 Lokalizáló lépések

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

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 [2.2 Tengelyek] rész tárgyalja, milyen további tengelyeket lehet használni, [2.3 Csomóponttesztek] rész pedig a rendelkezésre álló csomópontteszteket tárgyalja. Egyes csomóponttesztek jelentése függhet a használt tengelytől is.

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. A tengelytől is függ, hogy a predikátumokban található kifejezéseket hogyan kell kiértékelni, és ezért a predikátumok szemantikáját a tengelyekre vonatkozóan definiáljuk a [2.4 Predikátumok] részben.

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

2.2 Tengelyek

A következő tengelyeket használhatjuk:

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
[6]   AxisName   ::=   'ancestor'
| 'ancestor-or-self'
| 'attribute'
| 'child'
| 'descendant'
| 'descendant-or-self'
| 'following'
| 'following-sibling'
| 'namespace'
| 'parent'
| 'preceding'
| 'preceding-sibling'
| 'self'

2.3 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

Azok a csomóponttesztek, amelyek egyetlen QName-ből állnak akkor és csak akkor teljesülnek, ha a csomópont típusa (lásd az [5 Adatmodell] részt) 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.

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

2.4 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
[8]   Predicate   ::=   '[' PredicateExpr ']'
[9]   PredicateExpr   ::=   Expr

2.5 Rövidített szintaxis

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

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
[10]   AbbreviatedAbsoluteLocationPath   ::=   '//' RelativeLocationPath
[11]   AbbreviatedRelativeLocationPath   ::=   RelativeLocationPath '//' Step
[12]   AbbreviatedStep   ::=   '.'
| '..'
[13]   AbbreviatedAxisSpecifier   ::=   '@'?

3 Kifejezések

3.1 Alapvető fogalmak

A VariableReference változóhivatkozás a kiértékelése során azt az értéket veszi fel, amihez a változónév hozzá volt rendelve a kontextusban megadott változó-hozzárendelések által. Hibának számít, ha a változónév nem szerepel a kifejezés kontextusában szereplő egyetlen változó-hozzárendelésben sem.

Használhatunk zárójeleket a kifejezés részeinek a csoportosítására.

[14]   Expr   ::=   OrExpr
[15]   PrimaryExpr   ::=   VariableReference
| '(' Expr ')'
| Literal
| Number
| FunctionCall

3.2 Függvényhívások

A FunctionCall függvényhívás kifejezést úgy értékeljük ki, hogy FunctionName függvénynév által meghatározott függvényt a kifejezés kiértékelése során használt kontextus függvénykönyvtárában megkeressük, majd kiértékeljük az összes Argument argumentumot és ezeket a függvény által megkövetelt típusúra konvertáljuk, majd végül meghívjuk a függvényt az így kapott argumentumértékekkel. Hibának számít, ha az argumentumok száma nem egyezik meg a függvény által megkövetelttel vagy ha egy argumentumot nem lehet a függvény által megkövetelt típusra konvertálni. A FunctionCall kifejezés eredménye a függvény által visszaadott eredmény.

Az argumentumokat úgy konvertáljuk sztring típusúra, mint ahogy a string függvény hívása során konvertálódnának. Az argumentumokat úgy konvertáljuk szám típusúra, mint ahogy a number függvény hívása során konvertálódnának. Az argumentumokat úgy konvertáljuk boolean típusúra, mint ahogy a boolean függvény hívása során konvertálódnának. Azokat az argumentumokat, amelyeknek a típusa nem csomóponthalmaz, nem lehet csomóponthalmaz típusúra konvertálni.

[16]   FunctionCall   ::=   FunctionName '(' ( Argument ( ',' Argument )* )? ')'
[17]   Argument   ::=   Expr

3.3 Csomóponthalmazok

A lokalizáló utakat kifejezésekként is lehet használni. Ezek a kifejezések az út által kiválasztott csomóponthalmazt adják vissza eredményül.

A | operátor az operandusok egyesítését számítja ki, ahol az operandusoknak csomóponthalmazoknak kell lenniük.

A Predicatepredikátumokat arra használjuk, hogy a kifejezésekre további megszorításokat tegyünk ugyanúgy, ahogy a lokalizáló utaknál tesszük. Hibának számít, ha a kifejezés, amire további megszorítást akarunk tenni, nem csomóponthalmaz típusú lesz a kiértékelés során. A Predicate predikátumok a csomóponthalmazokra az adott tengelyen belül tesznek további megszorításokat.

MEGJEGYZÉS: A predikátum jelentése attól is nagymértékben függ, melyik tengelyre vonatkozik az adott predikátumot. Például a preceding::foo[1] az első foo elemet adja vissza visszafelé keresve a dokumentumban, mert az a tengely, amire a [1] predikátum vonatkozik, az előző tengely. Ezzel ellentétben a (preceding::foo)[1] az első foo elemet adja vissza előre keresve a dokumentumban, mert az a tengely, amire a [1] predikátumot vonatkozik, a leszármazott tengely.

A / és // operátorok segítségével épülnek fel a kifejezések és a relatív lokalizáló utak. Hibának számít, ha a kifejezés nem csomóponthalmazra értékelődik ki. A / operátor segítségével ugyanúgy képezhetünk összetett kifejezéseket, mint ahogy a lokalizáló utakban használtuk a / karaktert. Hasonlóan a lokalizáló utakhoz a // itt is a /descendant-or-self::node()/ rövidítésére szolgál.

Nincs olyan objektumtípus, amit csomóponthalmaz típusúra lehetne konvertálni.

[18]   UnionExpr   ::=   PathExpr
| UnionExpr '|' PathExpr
[19]   PathExpr   ::=   LocationPath
| FilterExpr
| FilterExpr '/' RelativeLocationPath
| FilterExpr '//' RelativeLocationPath
[20]   FilterExpr   ::=   PrimaryExpr
| FilterExpr Predicate

3.4 Booleanek

A boolean típusú objektumok a true és false értékek egyikét vehetik fel.

Az or (vagy) kifejezést úgy értékeljük ki, hogy mindkét operandusát kiértékeljük, majd az így kapott értékeket boolean típusúra konvertáljuk úgy, mint ahogy a boolean függvény hívása során konvertálódnának. Az eredmény true (igaz) lesz, ha a két érték valamelyik true, és false (hamis) lesz minden más esetben. Ha baloldali operandus igaz, akkor a jobboldali operandus már nem kerül kiértékelésre.

Az and (és) kifejezést úgy értékeljük ki, hogy mindkét operandusát kiértékeljük, majd az így kapott értékeket boolean típusúra konvertáljuk úgy, mint ahogy a boolean függvény hívása során konvertálódnának. Az eredmény true (igaz) lesz, ha mindkét érték true, és false (hamis) lesz minden más esetben. Ha baloldali operandus hamis, akkor a jobboldali operandus már nem kerül kiértékelésre.

An EqualityExpr (that is not just a RelationalExpr) or a RelationalExpr (that is not just an AdditiveExpr) is evaluated by comparing the objects that result from evaluating the two operands. Comparison of the resulting objects is defined in the following three paragraphs. First, comparisons that involve node-sets are defined in terms of comparisons that do not involve node-sets; this is defined uniformly for =, !=, <=, <, >= and >. Second, comparisons that do not involve node-sets are defined for = and !=. Third, comparisons that do not involve node-sets are defined for <=, <, >= and >.

If both objects to be compared are node-sets, then the comparison will be true if and only if there is a node in the first node-set and a node in the second node-set such that the result of performing the comparison on the string-values of the two nodes is true. If one object to be compared is a node-set and the other is a number, then the comparison will be true if and only if there is a node in the node-set such that the result of performing the comparison on the number to be compared and on the result of converting the string-value of that node to a number using the number function is true. If one object to be compared is a node-set and the other is a string, then the comparison will be true if and only if there is a node in the node-set such that the result of performing the comparison on the string-value of the node and the other string is true. If one object to be compared is a node-set and the other is a boolean, then the comparison will be true if and only if the result of performing the comparison on the boolean and on the result of converting the node-set to a boolean using the boolean function is true.

When neither object to be compared is a node-set and the operator is = or !=, then the objects are compared by converting them to a common type as follows and then comparing them. If at least one object to be compared is a boolean, then each object to be compared is converted to a boolean as if by applying the boolean function. Otherwise, if at least one object to be compared is a number, then each object to be compared is converted to a number as if by applying the number function. Otherwise, both objects to be compared are converted to strings as if by applying the string function. The = comparison will be true if and only if the objects are equal; the != comparison will be true if and only if the objects are not equal. Numbers are compared for equality according to IEEE 754 [IEEE 754]. Two booleans are equal if either both are true or both are false. Two strings are equal if and only if they consist of the same sequence of UCS characters.

MEGJEGYZÉS: If $x is bound to a node-set, then $x="foo" does not mean the same as not($x!="foo"): the former is true if and only if some node in $x has the string-value foo; the latter is true if and only if all nodes in $x have the string-value foo.

When neither object to be compared is a node-set and the operator is <=, <, >= or >, then the objects are compared by converting both objects to numbers and comparing the numbers according to IEEE 754. The < comparison will be true if and only if the first number is less than the second number. The <= comparison will be true if and only if the first number is less than or equal to the second number. The > comparison will be true if and only if the first number is greater than the second number. The >= comparison will be true if and only if the first number is greater than or equal to the second number.

MEGJEGYZÉS: Az XPath kifejezéseket XML dokumentumban használjuk, akkor a < és <= operátorok minden előfordulását az XML 1.0 szabályainak megfelelően kell írni, például a &lt; és &lt;= karaktersorozatokkal helyettesítve őket. A következő példában a test attribútum értéke egy XPath kifejezés:
<xsl:if test="@value &lt; 10">...</xsl:if>
[21]   OrExpr   ::=   AndExpr
| OrExpr 'or' AndExpr
[22]   AndExpr   ::=   EqualityExpr
| AndExpr 'and' EqualityExpr
[23]   EqualityExpr   ::=   RelationalExpr
| EqualityExpr '=' RelationalExpr
| EqualityExpr '!=' RelationalExpr
[24]   RelationalExpr   ::=   AdditiveExpr
| RelationalExpr '<' AdditiveExpr
| RelationalExpr '>' AdditiveExpr
| RelationalExpr '<=' AdditiveExpr
| RelationalExpr '>=' AdditiveExpr
MEGJEGYZÉS: A fenti nyelvtan következtében a precedenciasorrend a következőképpen alakul (a legkisebb precedenciával kezdve): és minden operátor balasszociatív. Például 3 > 2 > 1 ekvivalens (3 > 2) > 1-gyel, ami false lesz, ha kiértékeljük.

3.5 Számok

A számok lebegőpontos számokat reprezentálnak. Az értékük tetszőlges IEEE 754 [IEEE 754] szerinti dupla pontosságú 64 bites érték lehet. Beleértve a speciális "Not-a-Number" (NaN) - magyarul "nem szám" értéket is, a pozitív és negatív végtelen értéket is és a pozitív és negatív nullát is. Az IEEE 754 szabvány legfontosabb szabályainak összefoglalását lásd a [JLS] 4.2.3 szakaszában.

A numerikus operátorok operandusait úgy konvertáljuk számmá, mint ahogy a number függvény hívása során konvertálódnának.

A + operátor egy összeadást hajt végre.

A - operátor egy kivonást hajt végre.

MEGJEGYZÉS: Mivel az XML megengedi a - karakter használatát a nevekben, ezért a - operátor elé általában egy whitespace-t kell írni. Például a foo-bar kiértékelése során egy olyan csomóponthalmazt kapunk, a foo-bar nevű gyermekelemeket tartalmazza, míg a foo - bar kiértékelése során pedig egy olyan különbséget kapunk, ami az első foo gyermekelem sztringértékének a számmá konvertálásával kapott eredmény és az első bar gyermekelem sztringértékének a számmá konvertálásával kapott eredmény egymásból kivonásával jön létre.

A div operátor egy lebegőpontos osztást hajt végre az IEEE 754 szabályainak megfelelően.

A mod operátor egy maradékos osztás maradékát adja vissza. Például

MEGJEGYZÉS: Ez az operátor megegyezik a Java nyelvből és az ECMAScript nyelvből ismert % operátorral.
MEGJEGYZÉS: Ez az operátor nem egyezik meg az IEEE 754 szerinti maradékképzés operátorral, ami egy kerekítéssel végzett maradékos osztás maradékát adja vissza eredményül.
Numerikus kifejezések
[25]   AdditiveExpr   ::=   MultiplicativeExpr
| AdditiveExpr '+' MultiplicativeExpr
| AdditiveExpr '-' MultiplicativeExpr
[26]   MultiplicativeExpr   ::=   UnaryExpr
| MultiplicativeExpr MultiplyOperator UnaryExpr
| MultiplicativeExpr 'div' UnaryExpr
| MultiplicativeExpr 'mod' UnaryExpr
[27]   UnaryExpr   ::=   UnionExpr
| '-' UnaryExpr

3.6 Sztringek

A sztringek nulla, egy vagy több karakter sorozatából állnak, ahol a karakterek az [XML] XML ajánlás által definiált karakterek. Ennélfogva egy karakter az XPathban egyetlen Unicode absztrakt karakternek felel meg, aminek egyetlen Unicode skalár érték felel meg (lásd [Unicode]). Ez nem ugyanaz a dolog, mint a 16 bites Unicode kódérték: A Unicode által kódolt karakteres reprezentációja egy olyan absztrakt karakternek, aminek a Unicode skalár értéke nagyobb mint U+FFFF, egy 16 bites kódértékekből álló pár (egy helyettesítő pár). Sok programozási nyelven a sztringeket 16 bites Unicode kódértékekből álló sorozatok reprezentálják, az ilyen nyelveken alapuló XPath megvalósításoknak gondoskodniuk kell annak a biztosításáról, hogy a helyettesítő párokat helyesen egyetlen XPath karakterként értelmezze a rendszer.

MEGJEGYZÉS: Előfordulhat a Unicode-ban, hogy van két olyan sztring, amelyeket azonos módon kellene kezelni, jóllehet különböző Unicode absztrakt karaktersorozatból állnak. Például bizonyos ékezettel ellátott karaktereket lehet egyben és szétválasztott formában is ábrázolni. Ennélfogva az XPath kifejezések nem várt eredményre vezethetnek ha nem normalizáljuk kanonikus formára mind az XPath kifejezésben, mind pedig az XML dokumentumban előforduló karaktereket. Erről lásd bővebben a [Karaktermodell] dokumentumot.

3.7 Lexikális felépítés

A tokenekre bontás során mindig a lehető leghosszabb tokent adjuk vissza.

Az olvashatóság érdekében a kifejezésekben használhatunk whitespace-eket annak ellenére, hogy a nyelvtan ezt explicit módon nem engedi meg: ExprWhitespace kifejezést bármely ExprToken előtt vagy után lévő mintához szabadon hozzáadhatunk.

A következő speciális elemzési szabályokat kell alkalmazni a megadott sorrendben, hogy a ExprToken nyelvtana egyértelmű legyen:

A kifejezések lexikális felépítése
[28]   ExprToken   ::=   '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
| NameTest
| NodeType
| Operator
| FunctionName
| AxisName
| Literal
| Number
| VariableReference
[29]   Literal   ::=   '"' [^"]* '"'
| "'" [^']* "'"
[30]   Number   ::=   Digits ('.' Digits?)?
| '.' Digits
[31]   Digits   ::=   [0-9]+
[32]   Operator   ::=   OperatorName
| MultiplyOperator
| '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>='
[33]   OperatorName   ::=   'and' | 'or' | 'mod' | 'div'
[34]   MultiplyOperator   ::=   '*'
[35]   FunctionName   ::=    QName - NodeType
[36]   VariableReference   ::=   '$' QName
[37]   NameTest   ::=   '*'
| NCName ':' '*'
| QName
[38]   NodeType   ::=   'comment'
| 'text'
| 'processing-instruction'
| 'node'
[39]   ExprWhitespace   ::=   S

4 A Core függvénykönyvtár

Ez a szakasz azoknak a függvényeknek a leírását tartalmazza, amelyeket az XPath implementációk függvénykönyvtárának mindig tartalmaznia kell a kifejezések kiértékelése során.

A függvénykönyvtárban található minden függvényt a függvény prototípusával adunk meg, ami meghatározza a függvény visszatérési értékét, a függvény nevét és az argumentumok típusát. Ha az argumentum típusa után kérdőjel áll, akkor az argumentum opcionális, máskülönben az argumentum kötelező.

4.1 Csomóponthalmaz-függvények

Függvény: szám last()

A last függvény a kifejezés kiértékelésekor használt kontextus kontextusméretét adja vissza számként.

Függvény: szám position()

A position függvény a kifejezés kiértékelésekor használt kontextus kontextuspozícióját adja vissza számként.

Függvény: szám count(csomóponthalmaz)

A count függvény az argumentumként megadott csomóponthalmazban lévő csomópontok számát adja vissza.

Függvény: csomóponthalmaz id(objektum)

Az id függvény elemeket választ ki az egyedi azonosítójuk, ID-jük segítségével. (Lásd: [5.2.1 Egyedi ID-k]). Ha az id argumentuma csomóponthalmaz, akkor az id függvényt az argumentumban szereplő csomóponthalmaz minden csomópontjának a sztringértékére alkalmazzuk. Ha az id argumentuma nem csomóponthalmaz típusú, akkor az agrumentumot sztring típusúra konvertáljuk a string függvény meghívásával, majd az így kapott sztringet whitespace-ek által határolt tokenek listájaként értelmezzük (ahol a whitespace-t a S nyelvtani szabályra illeszkedő karakterek sorozataként értelmezzük). A függvényhívás eredmény egy olyan csomóponthalmaz, ami azokat a csomópontokat tartalmazza, amelyek a kontextuscsomóponttal megegyező dokumentumban vannak, és amelyekre teljesül, hogy az egyedi ID-jük megegyezik a fenti tokenlistában szereplő tokenek valamelyikével.

Függvény: sztring local-name(csomóponthalmaz?)

A local-name függvény a csomóponthalmaz típusú argumentumban található csomópontok közül az első csomópont kiterjesztett nevének a lokális részét adja vissza. Az első csomópontot a dokumentum rendezése szerinti sorrend alapján választja ki. Ha az argumentumban megadott csomóponthalmaz az üres halmaz, vagy az első csomópontnak nincs kiterjesztett neve, akkor a visszadott sztring az üres sztring. Ha az argumentum nincs megadva, akkor az alapértelmezett csomóponthalmaz az a halmaz, ami egyetlen elemként a kontextuscsomópontot tartalmazza.

Függvény: sztring namespace-uri(csomóponthalmaz?)

A namespace-uri függvény a csomóponthalmaz típusú argumentumban található csomópontok közül az első csomópont kiterjesztett nevének a névtér URI-ját adja vissza. Az első csomópontot a dokumentum rendezése szerinti sorrend alapján választja ki. Ha az argumentumban megadott csomóponthalmaz az üres halmaz, vagy az első csomópontnak nincs kiterjesztett neve, vagy a kiterjesztett név null, akkor a visszadott sztring az üres sztring. Ha az argumentum nincs megadva, akkor az alapértelmezett csomóponthalmaz az a halmaz, ami egyetlen elemként a kontextuscsomópontot tartalmazza.

MEGJEGYZÉS: A namespace-uri függvény által visszadott sztring csak akkor nem lesz üres sztring, ha elem típusú vagy attribútum típusú csomópontra hívjuk meg.

Függvény: sztring name(csomóponthalmaz?)

The name function returns a string containing a QName representing the expanded-name of the node in the argument node-set that is first in document order. The QName must represent the expanded-name with respect to the namespace declarations in effect on the node whose expanded-name is being represented. Typically, this will be the QName that occurred in the XML source. This need not be the case if there are namespace declarations in effect on the node that associate multiple prefixes with the same namespace. However, an implementation may include information about the original prefix in its representation of nodes; in this case, an implementation can ensure that the returned string is always the same as the QName used in the XML source. If the argument node-set is empty or the first node has no expanded-name, an empty string is returned. If the argument it omitted, it defaults to a node-set with the context node as its only member.

MEGJEGYZÉS: The string returned by the name function will be the same as the string returned by the local-name function except for element nodes and attribute nodes.

4.2 Sztring függvények

Függvény: sztring string(objektum?)

A string függvény egy objektumot sztringgé konvertál a következőképpen:

Ha nem adunk meg argumentumot a függvénynek, akkor az alapértelmezett argumentumérték az a csomóponthalmaz, ami egyetlen elemként a kontextuscsomópontot tartlmazza.

MEGJEGYZÉS: A string függvényt nem azért hoztuk létre, hogy ezzel konvertáljuk a számokat a felhasználó által is olvasható sztring formátumra. Erre a célra a format-number függvény és az [XSLT] xsl:number eleme szolgál.

Függvény: sztring concat(sztring, sztring, sztring*)

A concat függvény az argumentumai konkatenációját adja vissza.

Függvény: boolean starts-with(sztring, sztring)

A starts-with függvény true értéket ad vissza, ha az első argumentumban megadott sztring eleje megegyezik a második argumentumban megadott sztringgel, és false értéket ad vissza minden más esetben.

Függvény: boolean contains(sztring, sztring)

A contains függvény true értéket ad vissza, ha az első argumentumban megadott sztring tartalmazza a második argumentumban megadott sztringet, és false értéket ad vissza minden más esetben.

Függvény: sztring substring-before(sztring, sztring)

A substring-before függvény az első argumentumában megadott sztringnek azt a részét adja vissza, ami a második argumentumban megadott sztringnek az első argumentumban megadott első előfordulása előtt áll, vagy üres sztringet ad vissza akkor, ha az első argumentumban megadott sztring nem tartalmazza a második argumentumban megadott sztringet. Például a substring-before("1999/04/01","/") eredménye 1999.

Függvény: sztring substring-after(sztring, sztring)

A substring-after függvény az első argumentumában megadott sztringnek azt a részét adja vissza, ami a második argumentumban megadott sztringnek az első argumentumban megadott első előfordulása után áll, vagy üres sztringet ad vissza akkor, ha az első argumentumban megadott sztring nem tartalmazza a második argumentumban megadott sztringet. Például a substring-after("1999/04/01","/") eredménye 04/01, és a substring-after("1999/04/01","19") eredménye 99/04/01.

Függvény: sztring substring(sztring, szám, szám?)

A substring függvény az első argumentumában megadott sztringnek a második és harmadik argumentum által meghatározott részét adja vissza úgy, hogy a visszaadott rész az eredeti sztringnek a második argumentum által megadott pozíciójában kezdődik és a harmadik argumentum által megadott számú karaktert tartalmaz. Például a substring("12345",2,3) eredménye "234". Ha a harmadik argumentumot nem adjuk meg, akkor a függvény által visszaadott sztring az eredeti sztring második argumentum által megadott pozíciójától kezdődik és a sztring végéig tart. Például a substring("12345",2) eredménye "2345".

Pontosabban szólva a sztringben minden karakternek van egy egész számmal jellemezhető pozíciója: az első karakter pozíciója az 1, második karakter pozíciója a 2, és így tovább. (Erről bővebben lásd a [3.6 Sztringek] részt.)

MEGJEGYZÉS: Ez eltérést jelent a Java és ECMAScript nyelvekben megszokott működéstől, ahol a String.substring metódus az első karakter pozíciójához a 0 számot rendeli.

A visszaadott sztring azokat a karaktereket tartalmazza, amelyeknek a pozíciója nagyobb vagy egyenlő, mint a második argumentum egész számra kerekített értéke, és ha a harmadik argumentum is meg van adva, akkor egyben kisebb, mint második argumentum egész számra kerekített értékének és a harmadik argumentum egész számra kerekített értékenek az összege. A fenti összehasonlításokat és összeadást az IEEE 754 szabvány szabályai szerint végezzük. A kerekítést úgy végezzük, mint ahogy a round függvénye hívása végezné. A következő példák néhány ritkán előforduló esetet mutatnak be:

Függvény: szám string-length(sztring?)

A string-length a sztring típusú argumentumában megadott karakterek számát adja vissza. (Erről bővebben lásd a [3.6 Sztringek] részt.) Ha az argumentum nincs megadva, akkor az alapértelmezés a kontextuscsomópont sztring típusúra konvertált értéke, azaz más szavakkal a kontextuscsomópont sztringértéke.

Függvény: sztring normalize-space(sztring?)

A normalize-space függvény az argumentumában megadott sztringet whitespace-ekre normalizált formában adja vissza úgy, hogy a sztring elején és végén szereplő esetleges whitespace-eket levágja és a whitespace karakterekből álló karaktersorozatokat egyetlen whitespace karakterrel helyettesíti. A whitespace karakterek megegyeznek az XML S generálószabálya által megengedett karakterekkel. Ha az argumentum nincs megadva, akkor az alapértelmezés a kontextuscsomópont sztring típusúra konvertált értéke, azaz más szavakkal a kontextuscsomópont sztringértéke

Függvény: sztring translate(sztring, sztring, sztring)

A translate függvény az első argumentumában megadott sztringet adja vissza eredményül úgy, hogy ebben a sztringben a második argumentumában megadott karakterek előfordulásait a harmadik argumentum megfelelő pozíciójában lévő karakterekkel helyettesíti. Például a translate("bar","abc","ABC") eredménye a BAr sztring. Ha egy olyan karakter szerepel a második argumentumban, amihez a harmadik argumentum megfelelő pozíciójában már nincs megadva karakter (mert a második argumentumsztring hosszabb, mint a harmadik), akkor ennek a karakternek az előfordulásait a függvény törli az első argumentumsztringből. Például a translate("--aaa--","abc-","ABC") eredménye "AAA" lesz. Ha egy karakter egynél többször fordul elő a második sztringben, akkor az első előfordulása határozza meg, hogy milyen karakterrel lesz helyettesítve. ha a harmadik sztring hosszabb, mint a második, akkor a fölösleges karaktereket figyelmen kívül hagyjuk.

MEGJEGYZÉS: A translate függvény nem minden nyelven nyújt kielégítő megoldást a kisbetű/nagybetű konverzió megvalósítására. Ezért az XPath következő verziói a kisbetű/nagybetű konverzióhoz további függvényeket definiálhatnak majd.

4.3 Boolean függvények

Függvény: boolean boolean(objektum)

A boolean függvény boolean típusúra konvertálja az argumentumát a következők szerint:

Függvény: boolean not(boolean)

A not függvény true értéket ad vissza, ha az argumentuma false, és false értéket ad vissza egyébként.

Függvény: boolean true()

A true függvény true értéket ad vissza.

Függvény: boolean false()

A false függvény false értéket ad vissza.

Függvény: boolean lang(sztring)

A lang függvény attól függően ad vissza true vagy false értéket, hogy kontextuscsomópont nyelve, amit xml:lang attribútum ad meg, megegyezik-e az argumentum által megadott nyelvvel, illetve az argumentum által megadott nyelv alá rendelt nyelv-e. A kontextuscsomópont nyelvét az kontextuscsomópont xml:lang attribútuma segítségével határozza meg, vagy ha a kontextuscsomópontnak nincs ilyen attribútuma, akkor a kontextuscsomópont legközelebbi olyan ősének az xml:lang attribútumát veszi alapul, amelynek van ilyen attribútuma. Ha nem talál ilyen attribútumot, akkor a lang eredménye false lesz. Ha van ilyen attribútum, akkor a lang eredménye akkor lesz true, ha az attribútum értéke megegyezik az argumentum értékével, eltekintve a kisbetűk és nagybetűk közötti különbségektől, vagy ha olyan, - karakterrel kezdődő végződése van az attribútum értékének, amit figyelmen kívül hagyva az attribútum értéke megegyezik az argumentum értékével, eltekintve a kisbetűk és nagybetűk közötti különbségektől. Például lang("en") eredménye true lenne, ha a kontextuscsomópont az alábbi öt elem valamelyike lenne:

<para xml:lang="en"/>
<div xml:lang="en"><para/></div>
<para xml:lang="EN"/>
<para xml:lang="en-us"/>

4.4 Numerikus függvények

Függvény: number number(objektum?)

The number function converts its argument to a number as follows:

If the argument is omitted, it defaults to a node-set with the context node as its only member.

MEGJEGYZÉS: The number function should not be used for conversion of numeric data occurring in an element in an XML document unless the element is of a type that represents numeric data in a language-neutral format (which would typically be transformed into a language-specific format for presentation to a user). In addition, the number function cannot be used unless the language-neutral format used by the element is consistent with the XPath syntax for a Number.

Függvény: number sum(node-set)

The sum function returns the sum, for each node in the argument node-set, of the result of converting the string-values of the node to a number.

Függvény: number floor(number)

The floor function returns the largest (closest to positive infinity) number that is not greater than the argument and that is an integer.

Függvény: number ceiling(number)

The ceiling function returns the smallest (closest to negative infinity) number that is not less than the argument and that is an integer.

Függvény: number round(number)

The round function returns the number that is closest to the argument and that is an integer. If there are two such numbers, then the one that is closest to positive infinity is returned. If the argument is NaN, then NaN is returned. If the argument is positive infinity, then positive infinity is returned. If the argument is negative infinity, then negative infinity is returned. If the argument is positive zero, then positive zero is returned. If the argument is negative zero, then negative zero is returned. If the argument is less than zero, but greater than or equal to -0.5, then negative zero is returned.

MEGJEGYZÉS: For these last two cases, the result of calling the round function is not the same as the result of adding 0.5 and then calling the floor function.

5 Adatmodell

Az XPath az XML dokumentumokat fákként kezeli. Ez az alfejezet azt tárgyalja, hogyan modellezi az XPath az XML dokumentumokat. Az itt leírt modell csak elméleti modell és ezért az implementációra nézve nem tartalmaz megszorításokat. Azt, hogy milyen összefüggés van a modell és az XML Information Set [XML Infoset] között, a [B Leképezés az XML Information Set-re] rész tárgyalja.

Az XPath által használt XML dokumentumoknak meg kell felelniük az [XML Nevek] XML Namespaces ajánlásnak.

A fa csomópontokat (vagy röviden pontokat) tartalmaz. A csomópontoknak hét típusa van:

Minden csomóponttípus esetében meg lehet határozni egy az adott típusú csomópont sztringértékét. A csomóponttípusok egy részénél ez a sztringérték a csomópont részét képezi, más csomóponttípusoknál pedig a sztringértéket az adott csomópont leszármazottjainak a sztringértékéből kell kiszámolni.

MEGJEGYZÉS: Elem típusú csomópontok és gyökérpontok esetén a csomópont stringértéke nem egyezik meg a DOM nodeValue metódusa által visszaadott sztringgel. (Lásd: [DOM]).

Some types of node also have an expanded-name, which is a pair consisting of a local part and a namespace URI. The local part is a string. The namespace URI is either null or a string. The namespace URI specified in the XML document can be a URI reference as defined in [RFC2396]; this means it can have a fragment identifier and can be relative. A relative URI should be resolved into an absolute URI during namespace processing: the namespace URIs of expanded-names of nodes in the data model should be absolute. Two expanded-names are equal if they have the same local part, and either both have a null namespace URI or both have non-null namespace URIs that are equal.

There is an ordering, document order, defined on all the nodes in the document corresponding to the order in which the first character of the XML representation of each node occurs in the XML representation of the document after expansion of general entities. Thus, the root node will be the first node. Element nodes occur before their children. Thus, document order orders element nodes in order of the occurrence of their start-tag in the XML (after expansion of entities). The attribute nodes and namespace nodes of an element occur before the children of the element. The namespace nodes are defined to occur before the attribute nodes. The relative order of namespace nodes is implementation-dependent. The relative order of attribute nodes is implementation-dependent. Reverse document order is the reverse of document order.

Root nodes and element nodes have an ordered list of child nodes. Nodes never share children: if one node is not the same node as another node, then none of the children of the one node will be the same node as any of the children of another node. Every node other than the root node has exactly one parent, which is either an element node or the root node. A root node or an element node is the parent of each of its child nodes. The descendants of a node are the children of the node and the descendants of the children of the node.

5.1 Gyökérpont

A gyökérpont a fa gyökere. A gyökérpont csak a fa gyökerében lehet. A dokumentumelemhez tartozó elem típusú csomópont a gyökérpont gyermeke, azaz közvetlen leszármazottja. A gyökérpontnak további gyermekei lehetnek a feldolgozó utasítás típusú és megjegyzés típusú csomópontok, ha a dokumentum prológusában és/vagy a dokumentumelem lezárása után feldolgozó utasítások és megjegyzések vannak.

The string-value of the root node is the concatenation of the string-values of all text node descendants of the root node in document order.

The root node does not have an expanded-name.

5.2 Elem típusú csomópontok

There is an element node for every element in the document. An element node has an expanded-name computed by expanding the QName of the element specified in the tag in accordance with the XML Namespaces Recommendation [XML Names]. The namespace URI of the element's expanded-name will be null if the QName has no prefix and there is no applicable default namespace.

MEGJEGYZÉS: In the notation of Appendix A.3 of [XML Names], the local part of the expanded-name corresponds to the type attribute of the ExpEType element; the namespace URI of the expanded-name corresponds to the ns attribute of the ExpEType element, and is null if the ns attribute of the ExpEType element is omitted.

The children of an element node are the element nodes, comment nodes, processing instruction nodes and text nodes for its content. Entity references to both internal and external entities are expanded. Character references are resolved.

The string-value of an element node is the concatenation of the string-values of all text node descendants of the element node in document order.

5.2.1 Egyedi ID-k

An element node may have a unique identifier (ID). This is the value of the attribute that is declared in the DTD as type ID. No two elements in a document may have the same unique ID. If an XML processor reports two elements in a document as having the same unique ID (which is possible only if the document is invalid) then the second element in document order must be treated as not having a unique ID.

MEGJEGYZÉS: If a document does not have a DTD, then no element in the document will have a unique ID.

5.3 Attribútum típusú csomópontok

Each element node has an associated set of attribute nodes; the element is the parent of each of these attribute nodes; however, an attribute node is not a child of its parent element.

MEGJEGYZÉS: This is different from the DOM, which does not treat the element bearing an attribute as the parent of the attribute (see [DOM]).

Elements never share attribute nodes: if one element node is not the same node as another element node, then none of the attribute nodes of the one element node will be the same node as the attribute nodes of another element node.

MEGJEGYZÉS: The = operator tests whether two nodes have the same value, not whether they are the same node. Thus attributes of two different elements may compare as equal using =, even though they are not the same node.

A defaulted attribute is treated the same as a specified attribute. If an attribute was declared for the element type in the DTD, but the default was declared as #IMPLIED, and the attribute was not specified on the element, then the element's attribute set does not contain a node for the attribute.

Some attributes, such as xml:lang and xml:space, have the semantics that they apply to all elements that are descendants of the element bearing the attribute, unless overridden with an instance of the same attribute on another descendant element. However, this does not affect where attribute nodes appear in the tree: an element has attribute nodes only for attributes that were explicitly specified in the start-tag or empty-element tag of that element or that were explicitly declared in the DTD with a default value.

An attribute node has an expanded-name and a string-value. The expanded-name is computed by expanding the QName specified in the tag in the XML document in accordance with the XML Namespaces Recommendation [XML Names]. The namespace URI of the attribute's name will be null if the QName of the attribute does not have a prefix.

MEGJEGYZÉS: In the notation of Appendix A.3 of [XML Names], the local part of the expanded-name corresponds to the name attribute of the ExpAName element; the namespace URI of the expanded-name corresponds to the ns attribute of the ExpAName element, and is null if the ns attribute of the ExpAName element is omitted.

An attribute node has a string-value. The string-value is the normalized value as specified by the XML Recommendation [XML]. An attribute whose normalized value is a zero-length string is not treated specially: it results in an attribute node whose string-value is a zero-length string.

MEGJEGYZÉS: It is possible for default attributes to be declared in an external DTD or an external parameter entity. The XML Recommendation does not require an XML processor to read an external DTD or an external parameter unless it is validating. A stylesheet or other facility that assumes that the XPath tree contains default attribute values declared in an external DTD or parameter entity may not work with some non-validating XML processors.

There are no attribute nodes corresponding to attributes that declare namespaces (see [XML Names]).

5.4 Névtér típusú csomópontok

Each element has an associated set of namespace nodes, one for each distinct namespace prefix that is in scope for the element (including the xml prefix, which is implicitly declared by the XML Namespaces Recommendation [XML Names]) and one for the default namespace if one is in scope for the element. The element is the parent of each of these namespace nodes; however, a namespace node is not a child of its parent element. Elements never share namespace nodes: if one element node is not the same node as another element node, then none of the namespace nodes of the one element node will be the same node as the namespace nodes of another element node. This means that an element will have a namespace node:

A namespace node has an expanded-name: the local part is the namespace prefix (this is empty if the namespace node is for the default namespace); the namespace URI is always null.

The string-value of a namespace node is the namespace URI that is being bound to the namespace prefix; if it is relative, it must be resolved just like a namespace URI in an expanded-name.

5.5 Feldolgozó utasítás típusú csomópontok

Minden feldolgozó utasításhoz tartozik egy feldolgozó utasítás típusú csomópont, kivéve azokat a feldolgozó utasításokat, amelyek a dokumentumtípus-deklaráción belül találhatóak.

A feldolgozó utasításoknak kiterjesztett nevük van: a feldolgozó utasítás célja a kiterjesztett név lokális része, a kiterjesztett név névtér-URI-ja pedig null. A feldolgozó utasítás típusú csomópontok sztringértéke a feldolgozó utasításnak a cél megadása utáni része beleértve a whitespace-eket is, de nem hozzáadva a lezáró ?> karaktereket.

MEGJEGYZÉS: Az XML deklaráció nem minősül feldolgozó utasításnak. Ennélfogva az XML deklarációnak nem feleltethető meg egyetlen feldolgozó utasítás típusú csomópont sem.

5.6 Megjegyzés típusú csomópontok

A dokumenttípus-deklaráción belül előforduló megjegyzésektól eltekintve minden megjegyzésnek megfelel egy megjegyzés típusú csomópont a fában.

A megjegyzés típusú csomópont sztringértéke a megjegyzés tartalma a megjegyzés kezdetét jelző <!-- karakterek és a végét jelző --> karakterek nélkül.

A megjegyzés típusú csomópontoknak nincs kiterjesztett neve.

5.7 Szövegrész típusú csomópontok

A karakteres adatot szövegrész típusú csomópontokba tartalmazzák. A szövegrész típusú csomópontok mindig a lehető legtöbb karakteres adatot tartalmazzák, azaz a közvetlenül a szövegrész típusú csomópontok előtt, illetve után álló testvér-csomópontok sohasem lehetnek szövegrész típusúak. A szövegrész típusú csomópontok sztringértéke maga a karakteres adat. A szövegrész típusú csomópontoknak mindig tartalmaznak legalább egy karakternyi karakteres adatot.

A CDATA szakaszokon belül található minden karakter karakteres adatnak számít, ezért a forrásdokumentumban szereplő <![CDATA[<]]> karaktersorozatot ugyanúgy kezeljük, mint a &lt; karaktersorozatot. Mindkettő a fa szövegrész típusú csomópontjában szereplő egyetlen < karakternek felel meg. Tehát a CDATA szakaszt úgy tekintjük, mintha a <![CDATA[ és ]]> törölve lennének és a <, illetve & karakterek minden előfordulása a &lt;, illetve &amp; karaktersorozatokkal lenne helyettesítve.

MEGJEGYZÉS: Ha egy szövegrész típusú csomópont < karaktert tartalmaz és ezt a csomópontot XML-ként kiírjuk, akkor a < karaktert vagy helyettesíteni kell vagy a &lt; használatával, vagy pedig egy CDATA szakaszba kell beágyazni.

A megjegyzéseken, feldolgozó utasításokon és attribútumértéken belül levő karakterekhez nincs hozzárendelve szövegrész típusú csomópont. A külső entitásokban található sorvége jeleket #xA-ra normalizáljuk az [XML] XML ajánlásban leírtaknak megfelelően.

A szövegrész típusú csomópontoknak nincs kiterjesztett neve.

6 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.


A Hivatkozások

A.1 Normatív hivatkozások

IEEE 754
Institute of Electrical and Electronics Engineers. IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std 754-1985.
RFC2396
T. Berners-Lee, R. Fielding, and L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax. IETF RFC 2396. See http://www.ietf.org/rfc/rfc2396.txt.
XML
World Wide Web Consortium. Extensible Markup Language (XML) 1.0. W3C Recommendation. See http://www.w3.org/TR/1998/REC-xml-19980210
XML Nevek
World Wide Web Consortium. Namespaces in XML. W3C Recommendation. Lásd: http://www.w3.org/TR/REC-xml-names

A.2 Egyéb hivatkozások

Karaktermodell
World Wide Web Consortium. Character Model for the World Wide Web. W3C Working Draft. Lásd: http://www.w3.org/TR/WD-charmod
DOM
World Wide Web Consortium. Document Object Model (DOM) Level 1 Specification. W3C Recommendation. Lásd: http://www.w3.org/TR/REC-DOM-Level-1
JLS
J. Gosling, B. Joy, and G. Steele. The Java Language Specification. Lásd: http://java.sun.com/docs/books/jls/index.html.
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane. International Standard. Lásd: http://www.iso.ch/cate/d18741.html.
TEI
C.M. Sperberg-McQueen, L. Burnard Guidelines for Electronic Text Encoding and Interchange. Lásd: http://etext.virginia.edu/TEI.html.
Unicode
Unicode Consortium. The Unicode Standard. Lásd: http://www.unicode.org/unicode/standard/standard.html.
XML Infoset
World Wide Web Consortium. XML Information Set. W3C Working Draft. Lásd: http://www.w3.org/TR/xml-infoset
XPointer
World Wide Web Consortium. XML Pointer Language (XPointer). W3C Working Draft. Lásd: http://www.w3.org/TR/WD-xptr
XQL
J. Robie, J. Lapp, D. Schach. XML Query Language (XQL). Lásd: http://www.w3.org/TandS/QL/QL98/pp/xql.html
XSLT
World Wide Web Consortium. XSL Transformations (XSLT). W3C Recommendation. Lásd: http://www.w3.org/TR/xslt

B Az XPath és az XML Information Set közötti kapcsolat (nem normatív)

Az XPath adatmodellben szereplő csomópontok a következőképpen származtathatók az XML Information Set [XML Infoset] által meghatározott információs elemekből:

MEGJEGYZÉS: Az XML Information Set legújabb verziója, a május 17-i verziót fogja leváltó working draft verzió az XPath jelen verziójának a készítésekor közel volt a befejezéshez és várhatóan az XPath specifikáció megjelenésével egyidőben, vagy röviddel azután kerül kiadásra. Az itt leírt XPath és XML Information Set közötti leképezés ezen az XML Information Set Working Draft dokumentumon alapul. Ha ez az új verzió még nem jelent volna meg, akkor a W3C tagjai a belső munkacsoport verzióját is használhatják helyette: http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html (csak tagoknak).