XPath

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2017. szeptember 8-án felülvizsgált verziótól ; az ellenőrzések 14 szerkesztést igényelnek .

Az XPath (XML Path Language) egy XML - dokumentum elemeinek lekérdezési nyelve. Úgy tervezték, hogy hozzáférjen egy XML-dokumentum részeihez XSLT -transzformációs fájlokban , és W3C szabvány . Az XPath célja a DOM -navigáció megvalósítása XML -ben . Az XPath az XML-től eltérő kompakt szintaxist használ. A 2.0-s verzió 2007-ben készült el, és mára az XQuery 1.0 nyelv része. 2009 decemberében megkezdődött a 2.1-es verzió fejlesztése, amely az XQuery 1.1-et használja.

Jelenleg a legnépszerűbb verzió az XPath 1.0. Ennek oka a nyílt forráskódú könyvtárak XPath 2.0 támogatásának hiánya. Különösen a libxml2 - ről beszélünk , amelytől egyrészt a böngészők nyelvi támogatása, másrészt a szervertolmács támogatása függ.

Alapok

Az XML-nek fa szerkezete van. Az önálló XML-dokumentumnak mindig van egy gyökéreleme (az <?xml version="1.0"?> utasításnak semmi köze az elemfához), amelyben számos beágyazott elem megengedett, amelyek némelyike ​​beágyazott elemeket is tartalmazhat. . Szöveges csomópontokat, megjegyzéseket és utasításokat is láthat. Elképzelhető, hogy egy XML-elem beágyazott elemek tömbjét és attribútumok tömbjét tartalmazza.

A faelemeknek vannak őselemei és leszármazottai (a gyökérelemnek nincsenek ősei, a csonkelemeknek (a fa leveleinek) nincsenek gyermekei). A fa minden eleme egy bizonyos beágyazási szinten van (a továbbiakban: "szint"). Az XML szövegben az elemek sorrendben vannak, így beszélhetünk az előző és a következő elemeikről. Ez nagyon hasonlít a könyvtárak fájlrendszerben való rendszerezéséhez.

Az XPath sor leírja, hogyan lehet kiválasztani a kívánt elemeket egy olyan elemtömbből, amely tartalmazhat beágyazott elemeket. A kijelölés az átadott elemkészlettel kezdődik, az útvonal minden lépésénél kiválasztásra kerülnek a lépéskifejezésnek megfelelő elemek, és ennek eredményeként az adott útvonalnak megfelelő elemrészhalmaz kerül kiválasztásra.

Vegyük például a következő XHTML dokumentumot:

< html > < test > < div > Első réteg < span > szövegblokk az első rétegben </ span > </ div > < div > Második réteg </ div > < div > Harmadik réteg < span class = "text" > első blokk a harmadik rétegben </ span > < span class = "text" > második blokk a harmadik rétegben </ span > < span > harmadik blokk a harmadik rétegben </ span > </ div > < span > negyedik réteg </ span > < img /> </ body > </ html >

Az XPath elérési út /html/body/*/span[@class] megegyezik a benne lévő forrásdokumentum két elemével – <span class="text">первый блок в третьем слое</span>és <span class="text">второй блок в третьем слое</span>.

Az útvonalelemek túlnyomórészt XPath-ban vannak rövid formában írva. A fenti elérési út teljes formája: /child::html/child::body/child::*/child::span[attribútum::osztály]

Az elérési út címzési lépésekből áll, amelyeket perjel választ el egymástól /.

Minden címzési lépés három részből áll:

  • tengely (alapértelmezett gyermek::, elemtengely). A beágyazott elemek tengelye mentén történő szűrés mellett az elemek különböző tengelyei mentén és az attribútumtengely mentén is választhatunk (attribútum::, ezt a szimbólum is jelöli @) (lásd lent).
  • egy kifejezés, amely meghatározza a kiválasztandó elemeket (a példában a kijelölés úgy történik, hogy a dokumentumelemeket a html, body, span nevekhez illesztjük, és a szimbólumot használjuk *, amely a tengely összes elemét kijelöli)
  • predikátumok (ebben a példában attribútum::osztály) — további kiválasztási feltételek. Több is lehet. Minden predikátum szögletes zárójelben van, és egy logikai kifejezést tartalmaz a kiválasztott elemek tesztelésére. Ha nincs predikátum, akkor minden egyező elem ki van jelölve.

Az elérési út balról jobbra kerül elemzésre, és vagy a gyökércsomópont első elemének kontextusában kezdődik (ebben a példában ez a html elem), majd a gyermek:: tengely mentén lesznek beágyazott elemek. (ebben a példában ez egy body elem), ami kényelmes egy normál XML dokumentum egyetlen gyökércsomóponttal történő feldolgozásakor, vagy ha a karakter az XPath elején van megadva, akkor az /összes gyökérelemmel összefüggésben az átadott XML-ből a gyermek:: tengely mentén (ebben a példában ez egyetlen html elem lesz). Az aktuális kontextusban minden egyes címzési lépésnél kiválasztásra kerülnek olyan elemek, amelyek megfelelnek a lépésben megadott feltételeknek, és ezek listája a következő lépés kontextusaként vagy visszatérési eredményként kerül felhasználásra.

Így az első lépés /child::htmlexplicit módon a következő lépés aktuális kontextusát egy html elem listájává teszi, ami implicit módon megtörtént volna, ha ez a lépés nem lett volna megadva.

A példa második címzési lépésében (a gyermek::body lépésben) a kontextus egy html elem listája. A gyermek:: tengely azt mondja, hogy meg kell nézni a beágyazott elemek nevét az aktuális kontextusban, a törzsellenőrzési feltétel pedig azt, hogy azokat a csomópontokat, amelyek a törzsnévvel rendelkeznek, szerepelniük kell a generált elemkészletben. Így a második címzési lépés során egyetlen törzselemből álló csomópontok halmazát kapjuk, amely a harmadik lépés kontextusává válik.

A megszólítás harmadik lépése: gyermek::* . A gyermek:: tengely tartalmazza a törzselem összes közvetlen gyermekét, és a * tesztfeltétel azt mondja, hogy a fő típus bármely nevű elemei szerepeljenek a generált listában. Ebben a lépésben egy listát kapunk, amely három div elemből, egy span és egy img elemből áll - összesen öt elemből.

Negyedik megszólítási lépés: gyermek::span/@osztály. Kontextusa egy öt elemből álló lista, így a kimenő lista öt menetben (öt iteráció) jön létre. Az első iteráció során az első div lesz a környezeti csomópont. Adott a gyermek:: tengely és a span tesztszabály, a halmaznak tartalmaznia kell a div közvetlen gyermekeit, amelyek neve megegyezik a span-val. Van ott egy. A második iterációnál semmi sem kerül hozzáadásra a készlethez, mivel a második divnek nincs gyereke. A harmadik iteráció három span elemet fog látni egyszerre. A negyedik nem fog látni semmit, mivel a span elemnek nincsenek span leszármazottai, és az, hogy maga a span, nem számít, mert a leszármazottakat nézik. Az ötödik sem fog látni semmit, az img elemnek sincsenek span gyermekei. Tehát a teszt során négy span elemből álló csomópontkészletet lehetett kapni. Ez lenne a kontextus a további feldolgozáshoz, ha ebben a lépésben nincs megadva predikátum.

De mivel a negyedik lépésben van egy predikátum, mivel mind az öt lépés végrehajtásra kerül, a kiválasztott elemek további szűrése történik. Ebben az esetben a predikátum attribútum:: tengelye azt jelzi, hogy ellenőrizni kell, hogy a kiválasztott csomópont rendelkezik-e attribútumokkal, az osztályfeltétel pedig csak azokat a csomópontokat írja elő, amelyeknek osztály nevű attribútuma van. Ezért az első iterációnál az egyetlen talált tartomány nem megy át a predikátum szűrésen, a harmadik iterációnál három elemből kettő átmegy a szűrésen, és ennek eredményeként annak ellenére, hogy a szűrés átmegy öt iteráció, csak két span elem kerül be a végső halmazba.

Axes

A tengelyek képezik az XPath nyelv alapját . Egyes tengelyekre vannak rövidítések.

  • gyermek::  - leszármazott elemek halmazát tartalmazza (egy szinttel lejjebb található elemek). Ez a név teljesen le van rövidítve, vagyis teljesen elhagyható.
  • leszármazott::  - tartalmazza a leszármazott elemek teljes halmazát (vagyis mind a legközelebbi leszármazott elemeket, mind az összes leszármazott elemét). A kifejezés /descendant::node()/lerövidíthető //.
  • descendant-or-self::  tartalmazza a leszármazott elemek teljes halmazát és az aktuális elemet. Ennek a tengelynek a segítségével például második lépésként nem csak a gyökércsomópontból, hanem bármely csomópontból meg lehet szervezni az elemek kiválasztását: elég a gyökércsomópont összes leszármazottját a első lépés. Például egy elérési út kijelöli a dokumentum //spanösszes csomópontját span, függetlenül a hierarchiában elfoglalt helyüktől, és a gyökérelem nevét és az összes utód nevét is megvizsgálja a beágyazás teljes mélységéig.
  • ős::  - sok őselemet tartalmaz.
  • ancestor-or-self::  az őselemek halmazát és az aktuális elemet tartalmazza.
  • szülő::  - egy szinttel hátrébb tartalmazza az őselemet. Ez a hívás helyettesíthető a következővel:..
  • self::  - tartalmazza az aktuális elemet. Ez a hívás helyettesíthető a következővel:.
  • következő::  - a fa aktuális eleme alatt található elemek halmazát tartalmazza (minden szinten és rétegben), kivéve a saját leszármazottjaikat.
  • next-sibling::  az aktuális réteget követő testvérelemek halmazát tartalmazza.
  • megelőző::  - tartalmazza a fa aktuális eleme feletti elemek halmazát (minden szinten és rétegben), kivéve a saját elődök halmazát.
  • preding-sibling::  az aktuális réteget megelőző testvérelemek halmazát tartalmazza.
  • attribútum::  - az aktuális elem attribútumait tartalmazza. Ez a felszólítás helyettesíthető a szimbólummal@
  • névtér::  - egy adott névtérhez kapcsolódó elemek halmazát tartalmazza (vagyis van egy attribútum xmlns).

Egy kifejezés, amely megadja a kiválasztandó elemeket

A tengely tartalmán belül a kijelölés a kiválasztandó elemeket meghatározó kifejezés szerint történik.

Kifejezésként lehet

  • egy konkrét név adható meg, majd az ennek a névnek megfelelő tengelyelemek kerülnek kiválasztásra
  • a szimbólum van megadva *, amely a tengely összes elemét kijelöli
  • függvényekből összeállított kifejezést adunk meg, majd a kifejezés számításának eredményeit a tengely minden elemének kontextusában kiválasztja

A funkciók 5 csoportra oszthatók:

Funkciók csomóhalmazok felett

Funkció Leírás
node-set node() Magát a csomópontot adja vissza. E függvény helyett gyakran a helyettesítőt használják *, de a csillagtól eltérően a függvény szöveges csomópontokat node()is visszaad
string text() Visszaadja a csomópontot, ha az szöveg
node-set current() Egy elemből álló halmazt ad vissza, amely az aktuális. Ha állítjuk be a feldolgozást predikátumokkal, akkor ebből a predikátumból az aktuális elemet csak ez a függvény érheti el
number position() Egy elem helyzetét adja vissza a tengelyelemek halmazában. Csak hurokban működik megfelelően<xsl:for-each/>
number last() A tengelyelemek halmazának utolsó elemének számát adja vissza. Csak hurokban működik megfelelően<xsl:for-each/>
number count(node-set) A következő elemeinek számát adja vissza node-set.
string name(node-set?) A készlet első címkéjének teljes nevét adja vissza
string namespace-url(node-set?) Egy névteret meghatározó URL-címre mutató hivatkozást ad vissza
string local-name(node-set?) A készlet első címkéjének nevét adja vissza névtér nélkül
node-set id(object) Megkeres egy egyedi azonosítójú elemet

String függvények

Funkció Leírás
string string(object?) Az elem szöveges tartalmát adja vissza. Lényegében egy szinttel lejjebb adja vissza a szövegelemek egyesített halmazát
string concat(string, string, string*) Összefűzi az argumentumokban megadott karakterláncokat
number string-length(string?) A karakterlánc hosszát adja vissza
boolean contains(string, string) Visszatér true, ha az első sor tartalmazza a másodikat, ellenkező esetben -false
string substring(string, number, number?) Egy karakterláncból kivágott karakterláncot ad vissza, a megadott számtól kezdődően, és ha egy második szám van megadva, akkor a karakterek számától
string substring-before(string, string) Ha a második karakterlánc megtalálható az elsőben, akkor a karakterláncot a második karakterlánc első előfordulásáig adja vissza
string substring-after(string, string) Ha a második karakterlánc megtalálható az elsőben, akkor a második karakterlánc első előfordulása utáni karakterláncot adja vissza
boolean starts-with(string, string) Visszatér true, ha a második sor az első elején van, ellenkező esetben -false
boolean ends-with(string, string) Visszatér true, ha a második sor az első végén van, ellenkező esetben -false
string normalize-space(string?) Eltávolítja a felesleges és ismétlődő szóközöket, valamint a vezérlőkaraktereket, szóközökkel helyettesítve őket
string translate(string, string, string) Az első karakterláncban szereplő, a második karakterláncban előforduló karaktereket lecseréli a harmadik karakterláncban lévő karakterekre, amelyek megfelelnek a második karakterláncban lévő karakterek pozíciójának. Például a translate("bar", "abc", "ABC")BAr értéket adja vissza.

Logikai függvények és operátorok

Szimbólum, operátor Jelentése
or logikai "vagy"
and logikus "és"
= logikai "egyenlő"
<(<) logikus "kevesebb mint"
>(>) logikai "nagyobb"
<=(<=) logikai "kisebb vagy egyenlő"
>=(>=) logikai "nagyobb vagy egyenlő"
Funkció Leírás
boolean boolean(object) Egy objektumot logikai típusba önt
boolean true() Igazat ad vissza
boolean false() False értéket ad vissza
boolean not(boolean) A tagadás igaz értéket ad vissza, ha az argumentum hamis, és fordítva

Numerikus függvények és operátorok

Szimbólum, operátor Jelentése
+ kiegészítés
kivonás
* szorzás
div szabályos osztás ( nem egész! )
mod az osztály többi része
Funkció Leírás
number number(object?) Egy objektumot számmá alakít
number sum(node-set) A készlet összegét adja vissza. Minden beállított címkét karakterláncgá alakítunk, és számot kapunk belőle
number floor(number) Az argumentumnál nem nagyobb legnagyobb egész számot adja vissza (lefelé kerekítve)
number ceiling(number) Az argumentumnál nem kisebb legkisebb egész számot adja eredményül (felfelé kerekítés)
number round(number) Matematikai szabályok szerint kerekít egy számot

Rendszerfunkciók

Funkció Leírás
node-set document(object, node-set?) A paraméterben megadott dokumentumot adja visszaobject
string format-number(number, string, string?) A második paraméterben megadott minta szerint formáz egy számot. A harmadik paraméter határozza meg a figyelembe veendő megnevezett számformátumot.
string generate-id(node-set?) Egy karakterláncot ad vissza, amely egy egyedi azonosító
node-set key(string, object) Egy halmazt ad vissza a megadott kulccsal (hasonlóan az idazonosítók funkciójához)
string unparsed-entity-uri(string) Az elemzetlen URI-t adja vissza. Ha nincs, akkor üres karakterláncot ad vissza
boolean element-available(string) Ellenőrzi, hogy a paraméterben megadott elem vagy halmaz elérhető-e. A paraméter XPathként kezelendő
boolean function-available(string) Ellenőrzi, hogy elérhető-e a paraméterben megadott funkció. A paraméter XPathként kezelendő
object system-property(string) Rendszerváltozókat visszaadó paraméterek. Lehet:
  • xsl: version - a processzor XSLT verzióját adja vissza.
  • xsl: vendor - visszaadja az XSLT processzor gyártóját.
  • xsl: vendor-url - a gyártót azonosító URL-t ad vissza.

Ha ismeretlen paramétert használ, a függvény üres karakterláncot ad vissza

boolean lang(string) Akkor tér truevissza, ha az aktuális címkének van attribútuma xml: lang, vagy ha a címke szülője rendelkezik attribútummal xml: lang, és a karakterláncnak megfelelő karaktert tartalmazza

Predikátumok

A predikátumok szögletes zárójelben lévő logikai kifejezések, amelyek ugyanazok az elvek szerint épülnek fel, mint a kiválasztási kifejezés. Azok a kifejezések, amelyek nem logikai értéket, hanem üres elemkészletet adnak vissza, hamisnak minősülnek. A számot visszaadó kifejezést olyan kifejezésnek tekintjük, amely összehasonlítja a számot a position() értékkel. Ha egynél több predikátum van, mindegyik az előző predikátum alapján szűri a szűrés eredményét.

Egyéb jelölések XPathban

Kijelölés Leírás
* Bármely nevet vagy karakterkészletet jelöl a megadott tengely mentén, például: * - bármely gyermek csomópontot; @* - bármilyen tulajdonság
$name Hozzáférés egy változóhoz. name — változó vagy paraméter neve
[] További kiválasztási feltételek (vagy címzési lépés predikátuma). Tartalmaznia kell egy logikai értéket. Ha számértéket tartalmaz, akkor azt a csomópont sorszámának kell tekinteni, ami egyenértékű azzal, hogy ezt a számot a kifejezéssel előtagozzuk.position()=
{} Ha egy másik nyelvű (például HTML) címkén belül használják, akkor az XSLT processzor a kapcsos zárójelek tartalmát XPath-ként kezeli.
/ Meghatározza a fa szintjét, azaz elválasztja a címzési lépéseket
| Összevonja az eredményt. Ez azt jelenti, hogy egy útvonalon belül több elemzési útvonalat is írhat a jelen keresztül |, és egy ilyen kifejezés eredménye mindent tartalmaz, amit ezen útvonalak bármelyike ​​megtalál.

Linkek