XPath, XML Path Language, je upitni jezik za odabir čvorova iz XML dokumenta. Naknadno, XPath može da se koristi da izračunava vrednosti(na primer niski, brojeva, ili buleanskih vrednosti) iz sadržaja XML dokumenta. XPath je definisan od strane WWW konzorcijuma.[1]

Pregled uredi

XPath jezik se zasniva na predstavljanju XML dokumenta kao stabla, i pruža mogućnost kretanja po stablu, odabirajući čvorove raznim kriterijumima.[2][3] Kolikvijalno (ali ne i u zvaničnim specifikacijama), jedan XPath izraz se naziva jednim „Xpath-om“.

U početku motivisan željom da se nađe zajednička sintaksa i model ponašanja između Xpointera i XSLT-a, podskupovi Xpath upitnog jezika se koriste u drugim W3C specifikacijama kao što su W3C XML Schema, XForms i skup tagova za internacionalizaicju (Internationalization Tag Set (ITS)).

XPath su usvojile razne alatke i biblioteke za obradu XML-a, od kojih mnoge nude CSS selektore, još jedan W3C standard, kao prostiju alternativu za XPath.

Verzije uredi

Trenutno postoje tri verzije XPath-a u upotrebi. Poslednja verzija jezika (od 10.4.2014) je 3.0, ali XPath 1.0 je najrasporstranjenija verzija.[1]

  • XPath 1.0 je postao preporuka 16. novembra 1999. godine i u širokoj je upotrebi, bilo samostalan (pozivan preko API-a jezika kao što su Java, C#, pajton ili javaskript), ili ugrađen u jezike kao što su XSLT, XProc XML Schema ili Xforms.
  • XPath 2.0 je postao preporuka 23. januara 2007. godine. Izvestan broj implementcaija postoji, ali one nisu zastupljene kao XPath 1.0. Specifikacija jezika XPath 2.0 je mnogo veća od specifikacije XPath 1.0, i ona menja neke od osnivnih koncepata tog jezika, koao što je, na primer, sistem tipova.
    Najprimetnija promena je to što je XPath 2.0 izgrađen oko модела података XQuery-a и XPath-a koji ima mnogo bogatiji sistem tipova.[4]Sada se svaka vrednost predstavlja kao niz(pojedniačna atmoička vrednost ili čvor se posmatra kao niz dužine jedan). Skupovi čvorova iz XPath 1.0 su zamenjeni sa nizovima čvorova, koji mogu biti u bilo kom poretku.
    Da bi podržavao bogatije skupove tipova, XPath 2.0 nudi uveliko proširen skup funkcija i operatora.
    XPath 2.0 je zapravo podskup od XQuery 1.0. Oni dele isti model podataka (XDM). On nudi for izraz koji je skraćena verzija „FLWOR“ izraza iz XQuery-a. Moguće je opisati jezik navodeći delove XQuery-a koje on izostavlja: glavni primeri su upitni prolog, konstruktori elemenata i atributa, ostatak „FLWOR“ sintakse, i typeswitch izraz.
  • XPath 3.0 je postao preporuka 8. aprila 2014. godine.[5] najznačajnije novo svojstvo i je podrška za posmatranje funkcija kao „prvoklasnih“ vrednosti. XPath 3.0 je podskup XQuery 3.0-a, i najnovije implementacije (april 2014.) postoje kao deo „pogona“.
 
XPath izraz iksorišćen nad XML datotekom

Sintaksa i semantika (XPath 1.0) uredi

Najvažnija vrsta izraza u XPath-u je putanja lociranja. Putanja lociranja se sastoji od niza koraka lociranja. Svaki korak lociranja ima tri komponente:

Vrednost XPath izraza se izračunava u odnosu na kontekstni čvor. Specifikator ose kao što je 'dete' ili 'potomak' navodi pravac obilaska van kontekstnog čvora. Čvor test i predikat se koriste da izdvoje sve čvorove koje navede specifikator ose: na primer, čvor test 'A' zahteva da svi čvorovi koji se obiđu imaju oznaku 'A'. Predikat se može iskoristi da navede da izabrani čvorovi imaju neke osobine, koje su navedene od strane samih XPath izraza.

XPath sintaksa dolazi u dva stila: Skraćena sintaksa, koja je kompaktnija i omogućava da se XPath izrazi pišu i čitaju sa lakoćom koristeći intuitivne i, u mnogim slučajevima, poznate karaktere i konstrukte. Potpuna sintaksa je opsežnija, ali omogućava navođenje više opcija, i deskriptivija je ako se pažljivo čita.

Skraćena sintaksa uredi

Kompaktna notacija omogućava mnoge uobičajne izraze i skraćenice u prostijim slučajevima. Za dat XML koji sadrži

<A>
  <B>
    <C/>
  </B>
</A>

najprostiji XPath izraz je oblika

  • /A/B/C

i on bira sve elemente C koji su deca svih elemenata B koji su deca elementa A koji formira najobuhvatnji element XML dokumenta. XPath sintaksa je osmišljena da oponaša URI i uniksoliku sintaksu putanje datoteka.

Složeniji izrazi se mogu napraviti navodeći neku osu različitu od podrazumevane 'dete' ose, čvor test različit od običnog imena ili predikata koji mogu biti zapisani u uglastim zagradama posle svakog koraka. Na primer, izraz

  • A//B/*[1]

bira prvo dete ('*[1]'), nezavisno od imena, svakog elementa B koji je i sam dete ili dalji potomak ('//') elementa A koji je dete tekućeg sadržajnog čvora (izraz ne počinje sa '/'). Treba primetiti da predikat [1] tešnje određuje nego / operator. Da bi se izabrao prvi čvor kog određuje izraz A//B/*, treba napisati (A//B/*)[1]. Još treba primetiti da, indeksi u XPath predikatima (tehnički, 'udaljenosti položaja' XPath skupova čvorova), počinju od 1, a ne od 0, kao što je uobičajno u jezicima kao ćto su C ili Java.

Potpuna Sintaksa uredi

Napisani potpunom sintaksom, dva gorenavedena primera bi izgledala ovako

  • /child::A/child::B/child::C
  • child::A/descendant-or-self::node()/child::B/child::*[position()=1]

Ovde je u svakom koraku izraza eksplicitno navedena osa (npr. child ili descendant-or-self), praćena sa ::, a zatim sa čvor testom, kao što je A ili node(), iz gorenavedenih primera.

Osni specifikatori uredi

Osni specifikatori ukazuju na pravac navigacije u okviru stabla reprezentacije XML dokumenta. Osni specifikatori su:

Puna Sintaksa Skraćena Sintaksa Beleške
ancestor
ancestor-or-self
attribute @ @abc je skraćenica od attribute::abc
child xyz je skraćenica od child::xyz
descendant
descendant-or-self // // je skraćenica od /descendant-or-self::node()/
following
following-sibling
namespace
parent .. .. je skraćenica od parent::node()
preceding
preceding-sibling
self . . je skraćenica od self::node()

Primer korišćenja attribute specifikatora u skraćenom sintaksnom obliku, //a/@href odabira atribut koji se zove href u elementu a bilo gde u stablu reprezentacije dokumenta. Izraz . (skraćeni zapis od self::node()) je najkorišćeniji u okviru predikata i referiše na trenutno izabrani čvor. Na primer, h3[.='Pozdravna poruka'] odabira element h3 u trenutnom kontekstu, čija tekst sadržina je Pozdravna poruka.

Čvor testovi uredi

Čvor testovi mogu da se sastoje od imena određenih čvorova ili opštije, od izraza. U slučaju XML dokumenta, čiji je prefiks imenskog prostora gs definisan, //gs:enquiry će pronaći sve enquiry elemente u tom imenskom prostoru, i //gs:* će pronaći sve elemente, ne uzimajući u obzir lokalno ime, u tom imenskom prostoru.

Drugi formati čvor testova:

comment()
pronalazi XML čvor komentara, na primer <!-- Komentar -->
text()
pronalazi čvor tekstualnog tipa, na primer hello world u <k>hello<m> world</m></k>
processing-instruction()
pronalazi XML naredbu obrade kao što je <?php echo $a; ?>. U ovom slučaju, processing-instruction('php') bi odgovaralo.
node()
pronalazi bilo koji čvor iz skupa svih čvorova.

Predikati uredi

Predikati, zapisivani kao izrazi u kockastim zagradama, mogu se koristiti za restrikciju skupa čvorova radi odabira onih za koje je odrećeni uslov ispunjen. Na primer a[@href='help.php'] će odabrati one elemente a (među decom kontekstnog čvora) koji imaju href atribut čija je vrednost help.php.

Ne postoji ograničenje broja predikata po koraku, i oni ne moraju biti ograničeni do poslednjeg koraka ()u XPath(). Predikati mogu biti ugnježdeni do bilo koje dubine. Putanje navedene u predikatima počinju od konteksta tekućeg koraka( na primer od neposredno prethodnog testa čvora) i ne menjaju taj kontekst. Svi predikati moraju biti zadovoljeni da bi došlo do ()poklapanja().

Kada je vrednost predikata numerička, ona se tumači kao test na poziciji čvora. Tako p[1] odabira prvo dete koje je p element, dok p[last()] odabira poslednje.

U drugim slučajevima, vrednost predikata je automatski pretvorena u boolean. Kada se izvrši provera predikata u skupu čvorova, rezultat je istinit ukoliko je skup odgovarajućih čvorova neprazan. Tako p[@x] odabira one p elemente koji imaju atribut imenovan sa x.

Složeniji primer: izraz a[/html/@lang='en'][@href='help.php'][1]/@target odabira vrednosti target atributa prvog a elementa među svom decom kontekstnog čvora koji ima sopstveni href atribut postavljen na help.php, omogućujući da element najvišeg nivoa html takođe ima i lang atribut postavljen na en. Referenca na atribut elementa najvišeg nivoa u prvom predikatu ne utiče niti na kontekst drugih predikata niti na sam korak lociranja.

Redosled predikata je bitan ukoliko predikati testiraju poziciju čvora. Svaki predikat izdvaja skup čvorova izabranih u koraku lociranja. Stoga će a[1][@href='help.php'] pronaći podudaranje jedino u prvom a detetu kontekstnog čvora koje zadovoljava uslov @href='help.php', dok a[@href='help.php'][1] pronolazi prvo a dete koje zadovoljava ovaj uslov.

Funkcije i operatori uredi

XPath 1.0 definiše četiri tipa podataka: čvor-skupovi, stringovi, brojevi i logički tip.

Postojeći operatori su:

  • "/", "//" , "[...]" operatori se koriste u opisivanju putanje, na već prikazan način.
  • Operatorom uniranja, "|", obrazuje se unija dva čvor-skupa.
  • Logički operatori "and" i "or", i funkcija "not()"
  • Aritmetički operatori "+", "-", "*", "div", i "mod"
  • Operatori poređenja "=", "!=", "<", ">", "<=", ">="

Biblioteka funkcija obuhvata:

  • Funkcije za rad sa stringovima: concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
  • Funkcije za rad sa brojevima: sum(), round(), floor(), ceiling()
  • Funkcije kojima se dobijaju svojstva čvorova: name(), local-name(), namespace-uri()
  • Funkcije kojima se dobijaju informacije o kontekstu obrade: position(), last()
  • Pretvaranje tipova functions: string(), number(), boolean()

Neke od najkorišćenijih funkcija su opisane ispod. Za potpun opis pogledati [6]

Funkcije za rad sa skupovima čvorova uredi

position()
vraća broj koji predstavlja poziciju ovog čvora u nizu čvorova koji se trenutno obrađuju (na primer, čvorovi odabrani sa instrukcijom xsl:for-each instruction u XSLT).
count(node-set)
vraća broj čvorova u skupu čvorova prosleđenom kao argument.

String functions uredi

string(object?)
konvertuje bilo koji od četiri XPath tipa podataka u string prema predefinisanim pravilima. Ako je vrednost argumenta čvor-skup, funkcija vraća string-vrednost prvog čvora u redosledu dokumenta, ignorišući dalje čvorove.
concat(string, string, string*)
spaja dva ili više stringova
starts-with(s1, s2)
vraća true ako s1 započinje sa s2
contains(s1, s2)
vraća true ako s1 sadrži s2
substring(string, start, length?)
primer: substring("ABCDEF",2,3) vraća "BCD".
substring-before(s1, s2)
primer: substring-before("1999/04/01","/") vraća 1999
substring-after(s1, s2)
primer: substring-after("1999/04/01","/") vraća 04/01
string-length(string?)
vraća broj karaktera u stringu
normalize-space(string?)
beline sa krajeva bivaju uklonjene i svaki niz belina se zamenjuje jednim karakterom

Bulovske funkcije uredi

not(boolean)
negira bilo koji bulovski izraz.
true()
ima vrednost true.
false()
ima vrednost false.

Brojevne funkcije uredi

sum(node-set)
konvertuje sve string vrednosti čvorova nađenih sa XPath

argumentom u brojevima, posštujući pravila konverzije za dati sistem, i onda vraća

sumu ovih elemenata.

Primeri upotrebe uredi

Izrazi se mogu kreirati unutar predikata korišđenjem operatora: =, !=, <=, <, >= i : >. Bulovski izrazi se

mogu kombinovati sa zagradama () i bulovskim operatorima

and i or kao i sa not() funkcijom opisanom

iznad. Za numerička izračunavanja se koriste *, +, -, div i mod. Stringovi se mogu

sastojati od bilo kojih Unicode karaktera.

//item[@price > 2*@discount] bira stavke čiji atribut cena je veći od

dvostruke numeričke vrednosti popusta.

Čitav skup čvorova se može kombinovati ('unioned')

korišđenjem vertikalnog 'bar' karaktera |. Skup čvorova koji ispunjava jedan ili više

uslova se mogu naći korišđenjem unutar predikata sa 'or'.

v[x or y] | w[z] će vratiti jedan skup čvorova koji se sastoji od svih

v elemenata koji imaju x ili y decu

elemente, kao i sve w elemente koji imaju z ) decu

elemente.

Sintaksa i semantika(XPath 2.0) uredi

Primeri uredi

<?xml version="1.0" encoding="utf-8"?>
<wikimedia>
  <projects>
    <project name="Wikipedia" launch="2001-01-05">
      <editions>
        <edition language="English">en.wikipedia.org</edition>
        <edition language="German">de.wikipedia.org</edition>
        <edition language="French">fr.wikipedia.org</edition>
        <edition language="Polish">pl.wikipedia.org</edition>
        <edition language="Spanish">es.wikipedia.org</edition>
      </editions>
    </project>
    <project name="Wiktionary" launch="2002-12-12">
      <editions>
        <edition language="English">en.wiktionary.org</edition>
        <edition language="French">fr.wiktionary.org</edition>
        <edition language="Vietnamese">vi.wiktionary.org</edition>
        <edition language="Turkish">tr.wiktionary.org</edition>
        <edition language="Spanish">es.wiktionary.org</edition>
      </editions>
    </project>
  </projects>
</wikimedia>

XPath izraz

/wikimedia/projects/project/@name

bira name atribute za sve projekte, i

/wikimedia//editions

bira sve edicije za sve projekte, i

/wikimedia/projects/project/editions/edition[@language="English"]/text()

selektuje adrese svih Engleskih Wikimedia projekata(tekst svih edition elemenata gde je language atribut jednak English). I naredni

/wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()

bira adrese svih Wikipedia (tekst svih edition elemenata koji postoje pod project elementom sa name atributom Wikipedia)

Implementacija uredi

Alatke komandne linije
ActionScript
C/C++
Delphi
Free Pascal
  • Jedinica XPath je uključena u standardnu biblioteku.
Implementacije za pogon baza podataka
Java
  • Saxon XSLT podržava XPath 1.0, XPath 2.0 i XPAth 3.0 (kao i sa XSLT 2.0, XQuery 3.0, i XPath 3.0)
  • BaseX (takoće podržava XPath 2.0 i XQuery)
  • VTD-XML
  • QuiXPath[9], implementacija za strimovanje otvorenog koda od strane Innovimax-a


JavaScript
  • jQuery XPath nastavak [10] zasnovan na XPath 2.0 implementaciji u javaskriptu otvorenog koda[11]
.NET Framework
Perl
PHP
Pajton
Ruby
Scheme
SQL
  • MySQL podrćžava podskup XPath od verzije 5.1.5 nadalje[13]
  • PostgreSQL podržava XPath i XSLT od verzoke 8.4 nadalje[14]
Tcl
  • tdom paket[15] pruža „potpunu, kompatibilnu i brzu XPath implementaciju u C-u“

Korišćenje u šema jezicima uredi

XPath se dosta koristi za izražavanje ograničenja u šema jezicima za XML.

  • Šematski jezik Schematron, koji je sada već MOS (ISO) standard, je bio pionir tog pristupa.
  • XPath podskup za strimovanje se koristi u W3C XML Schema 1.0 za izražavanje jednistvenosti i ključnih ograničenja. U XSD 1.1, mogućnosti XPath-a su proširene da podržavaju uslovno dodeljivanje tipova zasnovanog na vrednostima atributa, da omoguće da se armitrarne buleanske vrednosti izračunavaju u zavisnosti od sadržaja elemenata.
  • XForms koristi XPath da bi vezao tipove za vrednosti.
  • Taj pristup je našao primenu i van XML aplikacija, kao što je jezik ograničenja za Javu nazvan PMD: Java se pretvara u stablo parsiranja nalik na DOM, a ѕatim se XPath pravila definišu nad tim stablom

Vidi još uredi

Reference uredi

  1. ^ a b „XML and Semantic Web W3C Standards Timeline” (PDF). 4. 2. 2012. Arhivirano iz originala (PDF) 24. 04. 2013. g. Pristupljeno 03. 06. 2015. 
  2. ^ Bergeron, Randy (31. 10. 2000). „XPath—Retrieving Nodes from an XML Document”. SQL Server Magazine. Arhivirano iz originala 26. 07. 2010. g. Pristupljeno 03. 06. 2015. 
  3. ^ Geneves, Pierre (2012). „Course: The XPath Language” (PDF). 
  4. ^ XPath 2.0 podržava atomičke tipove, definisane kao ugrađene tipove u XML Schema, i može da uveze korisnički definisane tipove iz sheme.
  5. ^ XPath 3.0 W3C preporuka
  6. ^ „W3C Dokumentaciju”. Arhivirano iz originala 09. 12. 2012. g. Pristupljeno 03. 06. 2015. 
  7. ^ „Pathan”. Arhivirano iz originala 08. 04. 2015. g. Pristupljeno 03. 06. 2015. 
  8. ^ „XQilla”. Arhivirano iz originala 18. 05. 2015. g. Pristupljeno 03. 06. 2015. 
  9. ^ QuiXPath
  10. ^ jQuery XPath nastavak
  11. ^ XPath 2.0 implementacija u Javaskcript
  12. ^ The XML C parser and toolkit of Gnome
  13. ^ MySQL :: MySQL 5.1 Reference Manual :: 12.11 XML Functions
  14. ^ Online docs atpostgresql.org
  15. ^ „tdom package”. Arhivirano iz originala 03. 06. 2015. g. Pristupljeno 03. 06. 2015. 

Spoljašnje veze uredi