XPath

XPath (lyhenne sanoista "XML Path Language") on ei-XML-pohjainen kieli XML-dokumenttien osien osoittamiseen ja XML-dokumentin rakenteeseen perustuvan tiedon luontiin. XPath-kieli perustuu XML-dokumentin puumuotoiseen esitystapaan ja antaa siten mahdollisuuden poimia eri osia dokumentista tietyillä valintakriteereillä. XPath kehitettiin halusta saada yhtenäinen syntaksi ja käyttäytymismalli XPointerin ja XSL:n välille. Kehittäjät ovat nopeasti ottaneet XPathin käyttöönsä pienenä kyselykielenä.
Merkintätapa.
Yleisin XPath-lauseke on polkulauseke, josta kieli on saanut nimensä. Polkulauseke koostuu peräkkäisistä askeleista, joilla päästään XML-solmusta yhteen tai useampaan toiseen solmuun. Askeleet erotetaan toisistaan vinoviivalla, ”/”. Jokaisessa askeleessa on vähintään kaksi osaa:
Näistä viimeinen eli predikaatti on vapaaehtoinen osa, mutta niitä voi olla useita peräkkäin. Komponentit esiintyvät yllä luetellussa järjestyksessä. Akselimäärittely ja solmutesti erotetaan tosistaan kahdella kaksoispisteellä codice_1, predikaatit erotetaan kirjoittamalla kukin niistä hakasulkeiden codice_2 sisään.
Tarjolla on kaksi eri merkintätapaa. Lyhennetty syntaksi on tiiviimpi ja usein helpompi lukea ja kirjoittaa – usein tutuilla merkeillä ja rakenteilla. Täysi syntaksi on monisanaisempi, mutta sen avulla voi määritellä enemmän asetuksia.
Lyhennetty syntaksi.
Tiivis merkintätapa sallii joitain oletuksia ja lyhenteitä. Yksinkertaisin XPath-lauseke on muotoa codice_3, joka valitsee XML-juurielementin A lapsielementtien B lapsielementit C. XPathin syntaksi on suunniteltu muistuttamaan URI:n ja tiedostopolkujen syntaksia.
Monimutkaisempia lausekkeita voi muodostaa muun muassa määrittelemällä:
Esimerkiksi lauseke codice_4 valitsee ensimmäisen (codice_5) minkä tahansa nimisen elementin (codice_6), joka on lapsi (codice_7) elementille B, joka taas itsessään on elementin A jälkeläinen (codice_8), joka on nykyisen kontekstisolmun lapsi, koska koko lauseke ei ala merkillä codice_7 tai muulla akselimäärittelyllä.
Täysi syntaksi.
Lyhentämättömässä syntaksissa yllä olevat esimerkit näyttävät tältä:
Jokaisessa askeleessa akseli on määritelty eksplisiittisesti: codice_13 tai codice_14). Akselia seuraa codice_1 ja solmutesti, kuten codice_16 tai codice_17 yllä olevissa esimerkeissä.
Akselimäärittelyt.
Akselimäärittely ilmaisee liikkumissuuntaa XML-dokumentin puumaisessa esitystavassa. Mahdolliset akselimäärittelyt ja niiden merkitykset ovat:
Esimerkkinä attribute-akselin käytöstä, codice_18 valitsee attribuutin nimeltä codice_19 dokumentin miltä tahansa codice_20 elementiltä. Suuntaa self käytetään usein predikaatissa viittaamaan kontekstisolmuun. Esimerkiksi codice_21 valitsee elementin nimeltä codice_22, jonka tekstisisältö on codice_23.
Jos XML-dokumentti piirretään puumuotoon, akselit jakavat dokumentin neljään erilliseen lohkoon: vaakatasossa preceding–following -akselilla ja pystytasossa ancestor–descendant -akselilla. Syntaksin näkökulmasta codice_24 sisältää elementit, joiden lopputagi on jo tullut vastaan ja codice_25 elementit, joiden alkutagi ei ole vielä tullut vastaan (pois lukien jälkeläiset). Vastaavasti codice_26 vastaa avoinna olevia elementtejä, ja codice_27 kontekstisolmusta avattavia elementtejä.
Solmutestit.
Elementtien, attribuuttien ja nimiavaruuksien kohdalla solmutesti muodostuu kohteen nimestä. Muilla tyypeillä se koostuu solmun tyyppiä vastaavasta solmutestistä.
Kun XPath-askeleessa solmutestinä on kohteen nimi, viittaa nimi oletuksena aina kohteeseen, jolle ei ole määritelty mitään nimiavaruutta. Haettaessa johonkin nimiavaruuteen kuuluvaa elementtiä tai attribuuttia, pitää solmutestissä aina käyttää nimiavaruusetuliitettä, joka erotetaan kaksoispisteellä nimestä. Tämä pätee vaikkei kohteella dokumentissa olisikaan etuliitettä vaan se kuuluisi oletusnimiavaruuteen. Nimiavaruusetuliitteen ei tarvitse olla sama, mitä dokumentissa mahdollisesti käytetty etuliite. Esimerkiksi jos nimiavaruudelle on määritelty etuliite codice_28, niin codice_29 löytää kaikki codice_30-nimiset solmut siitä nimiavaruudesta. XPath-kieli ei ota kantaa miten nimiavaruus sidotaan etuliitteeseen vaan se riippuu käytettävästä ohjelmointiympäristöstä.
Solmun tyyppiä vastaavat testit ovat:
Predikaatit.
Predikaatti on vapaaehtoinen osa XPath-askelta. Predikaatti on suodatusehdon tavoin toimiva hakasulkeiden sisällä oleva XPath-lauseke, jonka tulee olla tosi, jotta solmu tulee valituksi mukaan solmujoukkoon. Esimerkiksi codice_34, poimii vain ne codice_20 elementit, jolla on codice_19 attribuutti ja sillä arvona codice_37. Valinta ei kuitenkaan osu itse attribuuttiin vaan elementtiin, koska tarkentava askel on predikaatissa.
Predikaattien määrälle ei ole rajoituksia eikä niiden tarvitse sijaita polkulausekkeen lopussa. Niitä voi sijoittaa myös sisäkkäin. Predikaatin sisällä käytettävä mahdollinen polku alkaa elementistä, jolle predikaatti alun perin määriteltiin eikä se vaikuta predikaatin ulkopuolella olevaan kontekstiin.
Esimerkki: codice_38 poimii codice_39 attribuutin codice_20 elementiltä edellyttäen että sillä on codice_19 attribuuttina arvo codice_37 ja että codice_20 elementti on codice_44 elementin sisällä jolla puolestaan on codice_45 attribuuttina arvo codice_46.
Funktiot ja operaattorit.
XPath 1.0:ssa dokumentin rakenteet ovat olioita, jotka voidaan jakaa neljään eri tietotyyppiin: solmujoukko, merkkijono, numero sekä boolean-tyyppi.
Käytettävissä olevat operaattorit ovat:
 Palauttaa argumenttina annetun solmujoukon koon.
 Palauttaa argumenttina annetun id-tunnisteen mukaisen elementin.
 Palauttaa kontekstijoukon koon.
 Palauttaa argumenttina annetun solmun "paikallisen nimen". Mikäli argumenttia ei anneta, argumenttina käytetään kontekstijoukon ensimmäistä solmua.
 Palauttaa argumenttina annetun solmun "tarkennetun nimen" ("QName"). Mikäli argumenttia ei anneta, argumenttina käytetään kontekstijoukon ensimmäistä solmua.
 Palauttaa argumenttina annetun solmun "nimiavaruus URIn". Mikäli argumenttia ei anneta, argumenttina käytetään kontekstijoukon ensimmäistä solmua.
 Palauttaa konteksijoukossa solmun sijaintia vastaavan luvun.
 Palauttaa argumenttinsa yhteenliitettyinä.
 Palauttaa tosi, jos ensimmäinen argumentti sisältää jälkimmäisen, muuten palauttaa epätosi.
 Palauttaa argumentin normalisoituna.
 Palauttaa tosi, jos ensimmäinen argumentti alkaa jälkimmäisellä, muuten palauttaa epätosi.
 Palauttaa oliota vastaavan merkkijonon.
 Palauttaa merkkijonon pituuden. Mikäli argumenttia ei anneta käytetään kontekstisolmun "tekstiarvoa"
 Palauttaa alimerkkijonon, joka alkaa toisen argumentin osoittamasta paikasta ja jonka pituus vastaa kolmatta argumenttia. Jos kolmatta argumenttia ei ole, pituus on ensimmäisen argumentin loppuun saakka. Huom! Merkkijonon kirjainten indeksointi alkaa luvusta 1.
 Palauttaa alimerkkijonon, joka seuraa ensimmäisessä argumentissa jälkimmäistä
 Palauttaa alimerkkijonon, joka edeltää ensimmäisessä argumentissa jälkimmäistä
 Palauttaa ensimmäisen argumentin, jossa toisen argumentin osoittamat merkit on korvattu vastaavalla sijalla kolmannessa argumentissa olevilla merkeillä.
 Palauttaa arvon epätosi.
 Palauttaa tosi, mikäli kontekstisolmun kieli codice_64-attribuutilla merkittynä vastaa argumenttina annettua merkkijonoa.
 Palauttaa arvon tosi argumentin ollessa epätosi, muussa tapauksessa päinvastoin.
 Palauttaa arvon tosi.
 Palauttaa argumentin pyöristettynä kattofunktiolla.
 Palauttaa argumentin pyöristettynä lattiafunktiolla.
 Palauttaa oliota muunnettuna numeroarvoksi.
 Palauttaa argumentin pyöristettynä lähimpään kokonaislukuun.
 Palauttaa solmujoukon solmuja vastaavien numeroarvojen summan