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.
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:
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.
A tengelyek képezik az XPath nyelv alapját . Egyes tengelyekre vannak rövidítések.
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
A funkciók 5 csoportra oszthatók:
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 |
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. |
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 |
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 |
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:
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 |
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.
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. |
Lekérdezési nyelvek | |
---|---|
XSL | |
---|---|
World Wide Web Consortium (W3C) | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Termékek és szabványok |
| ||||||||||||||
Szervezetek |
| ||||||||||||||
TOVÁBB |
| ||||||||||||||
Konferenciák |
|