XPath (XML Path Language) je dotazovací jazyk pro prvky dokumentu XML . Navrženo pro přístup k částem dokumentu XML v transformačních souborech XSLT a je standardem W3C . XPath si klade za cíl implementovat DOM navigaci v XML . XPath používá kompaktní syntaxi, která se liší od XML. Verze 2.0 byla dokončena v roce 2007 a nyní je součástí jazyka XQuery 1.0. V prosinci 2009 byl zahájen vývoj verze 2.1, která používá XQuery 1.1.
V současné době je nejoblíbenější verzí XPath 1.0. To je způsobeno chybějící podporou XPath 2.0 z knihoven s otevřeným zdrojovým kódem. Konkrétně mluvíme o libxml2 , na kterém závisí na jedné straně jazyková podpora v prohlížečích a na straně druhé podpora ze strany serverového interpreta.
XML má stromovou strukturu. Samostatný XML dokument má vždy jeden kořenový element (instrukce <?xml version="1.0"?> nemá nic společného se stromem elementů), ve kterém je povolena řada vnořených elementů, z nichž některé mohou obsahovat i vnořené elementy. . Můžete také zobrazit textové uzly, komentáře a pokyny. Prvek XML si můžete představit tak, že obsahuje pole vnořených prvků a pole atributů.
Prvky stromu mají prvky předka a prvky potomka (kořenový prvek nemá žádné předky a prvky pahýlu (listy stromu) nemají potomky). Každý prvek stromu je na určité úrovni vnoření (dále jen „úroveň“). Prvky jsou v textu XML seřazeny podle pořadí, takže můžeme mluvit o jejich předchozích a následujících prvcích. Je to velmi podobné uspořádání adresářů v systému souborů.
Řádek XPath popisuje, jak vybrat požadované prvky z pole prvků, které mohou obsahovat vnořené prvky. Výběr začíná předanou sadou prvků, v každém kroku cesty se vyberou prvky odpovídající výrazu kroku a v důsledku toho se vybere podmnožina prvků odpovídající dané cestě.
Vezměte například následující dokument XHTML :
< html > < tělo > < div > První vrstva < span > blok textu v první vrstvě </ span > </ div > < div > Druhá vrstva </ div > < div > Třetí vrstva < span class = "text" > první blok ve třetí vrstvě </ span > < span class = "text" > druhý blok ve třetí vrstvě </ span > < span > třetí blok ve třetí vrstvě </ span > </ div > < span > čtvrtá vrstva </ span > < img /> </ tělo > </ html >Cesta XPath /html/body/*/span[@class] bude odpovídat dvěma prvkům zdrojového dokumentu v ní – <span class="text">первый блок в третьем слое</span>a <span class="text">второй блок в третьем слое</span>.
Prvky cesty jsou převážně psány v XPath ve zkrácené formě. Úplný tvar výše uvedené cesty je /child::html/child::body/child::*/child::span[atribut::class]
Cesta se skládá z kroků adresování, které jsou odděleny lomítkem /.
Každý krok adresování se skládá ze tří částí:
Cesta je analyzována zleva doprava a začíná buď v kontextu prvního prvku kořenového uzlu (v tomto příkladu je to prvek html), a poté podél osy potomka:: v ní budou vnořené prvky. (v tomto příkladu se jedná o jeden prvek těla), což je výhodné v případě zpracování běžného dokumentu XML s jedním kořenovým uzlem, nebo, pokud je znak zadán na začátku XPath /, v kontextu se všemi kořenovými prvky předávaného XML podél podřízené osy:: (v tomto příkladu to bude jeden html prvek). V každém kroku adresování v aktuálním kontextu jsou vybrány prvky, které odpovídají podmínkám zadaným v kroku, a jejich seznam se bere jako kontext pro další krok nebo jako výsledek návratu.
První krok tedy /child::htmlexplicitně učiní aktuální kontext pro další krok seznamem jednoho html prvku, což by bylo implicitně provedeno, kdyby tento krok nebyl specifikován.
Ve druhém kroku adresování v tomto příkladu (krok child::body) je kontext seznamem jednoho prvku html. Podřízená osa:: říká, že se musíte podívat na názvy vnořených prvků v aktuálním kontextu, a podmínka kontroly těla říká, že ty uzly, které mají název tělo, musí být zahrnuty do vygenerované sady prvků. Během druhého kroku adresování tak získáme sadu uzlů skládající se pouze z jednoho prvku těla, který se stává kontextem pro třetí krok.
Třetí krok oslovování: dítě::* . Osa child:: obsahuje všechny přímé potomky prvku body a podmínka testu * říká, že do generovaného seznamu by měly být zahrnuty prvky hlavního typu s libovolným názvem. Během tohoto kroku získáme seznam sestávající ze tří prvků div, jednoho prvku span a jednoho prvku img – celkem pět prvků.
Čtvrtý krok adresování: child::span/@class. Jeho kontext je seznam pěti položek, takže odchozí seznam je vytvořen v pěti průchodech (pěti iteracích). Při první iteraci se první div stane kontextovým uzlem. Vzhledem k ose child:: a pravidlu testu rozpětí musí sada obsahovat bezprostřední potomky tohoto div, jehož jméno se rovná rozpětí. Je tam jeden. Při druhé iteraci se do sady nic nepřidá, protože druhý div nemá žádné potomky. Třetí iterace uvidí tři prvky span najednou. Čtvrtý neuvidí nic, protože prvek span nemá žádné potomky typu span a na skutečnosti, že se jedná o samotný rozsah, nezáleží, protože se prohlížejí právě potomci. Pátý také nic neuvidí, img prvek také nemá žádné span děti. Takže během testu bylo možné získat sadu uzlů sestávající ze čtyř prvků rozpětí. Toto by byl kontext pro další zpracování, pokud by v tomto kroku nebyl specifikován žádný predikát.
Ale protože ve čtvrtém kroku existuje predikát, při každém z pěti průchodů se provede dodatečné filtrování vybraných prvků. V tomto případě atribut:: osa predikátu indikuje potřebu zkontrolovat, zda vybraný uzel má atributy, a podmínka třídy vyžaduje ponechat pouze ty uzly, které mají atribut pojmenovaný class. A proto při první iteraci jediný nalezený rozsah neprojde filtrací predikátem, ve třetí iteraci dva ze tří prvků filtrací projdou a ve výsledku, přestože filtrování probíhá přes pět iterací, do finální sady se dostanou pouze dva prvky span.
Osy jsou základem jazyka XPath. Pro některé osy existují zkratky.
V rámci obsahu osy se výběr provádí podle výrazu, který definuje prvky, které mají být vybrány.
Jako výraz to může být
Funkce jsou rozděleny do 5 skupin:
Funkce | Popis |
---|---|
node-set node() | Vrátí samotný uzel. Místo této funkce se často používá náhrada *, ale na rozdíl od hvězdičky funkce node()vrací i textové uzly |
string text() | Vrátí uzel, pokud se jedná o text |
node-set current() | Vrátí sadu jednoho prvku, který je aktuální. Pokud provádíme zpracování sady s predikáty, pak jediným způsobem, jak se z tohoto predikátu dostat k aktuálnímu prvku, bude tato funkce |
number position() | Vrátí polohu prvku v sadě prvků osy. Funguje správně pouze ve smyčce<xsl:for-each/> |
number last() | Vrátí číslo posledního prvku v sadě prvků osy. Funguje správně pouze ve smyčce<xsl:for-each/> |
number count(node-set) | Vrátí počet prvků v node-set. |
string name(node-set?) | Vrátí celý název první značky v sadě |
string namespace-url(node-set?) | Vrátí odkaz na adresu URL určující jmenný prostor |
string local-name(node-set?) | Vrátí název první značky v sadě bez jmenného prostoru |
node-set id(object) | Najde prvek s jedinečným ID |
Funkce | Popis |
---|---|
string string(object?) | Vrátí textový obsah prvku. V podstatě vrátí sloučenou sadu textových prvků o úroveň níže |
string concat(string, string, string*) | Zřetězí řetězce zadané v argumentech |
number string-length(string?) | Vrátí délku řetězce |
boolean contains(string, string) | Vrátí true, pokud první řádek obsahuje druhý, jinak -false |
string substring(string, number, number?) | Vrátí řetězec vyříznutý z řetězce, počínaje zadaným číslem, a pokud je zadáno druhé číslo, počtem znaků |
string substring-before(string, string) | Pokud je druhý řetězec nalezen v prvním, vrátí řetězec až po první výskyt druhého řetězce |
string substring-after(string, string) | Pokud je druhý řetězec nalezen v prvním, vrátí řetězec po prvním výskytu druhého řetězce |
boolean starts-with(string, string) | Vrátí true, pokud je druhý řádek na začátku prvního, jinak -false |
boolean ends-with(string, string) | Vrátí true, pokud je druhý řádek na konci prvního, jinak -false |
string normalize-space(string?) | Odstraní nadbytečné a opakované mezery a také řídicí znaky a nahradí je mezerami |
string translate(string, string, string) | Nahradí znaky v prvním řetězci, které se vyskytují ve druhém řetězci, znaky ve třetím řetězci, které odpovídají pozicím znaků ve druhém řetězci. Například translate("bar", "abc", "ABC")vrátí BAr. |
Symbol, operátor | Význam |
---|---|
or | logické "nebo" |
and | logické "a" |
= | logické "rovná se" |
<(<) | logické "méně než" |
>(>) | logické "větší" |
<=(<=) | logické "menší nebo rovno" |
>=(>=) | logické "větší než nebo rovno" |
Funkce | Popis |
---|---|
boolean boolean(object) | Přetypuje objekt na booleovský typ |
boolean true() | Vrací true |
boolean false() | Vrací false |
boolean not(boolean) | Negace, vrátí true, pokud je argument nepravdivý a naopak |
Symbol, operátor | Význam |
---|---|
+ | přidání |
− | odčítání |
* | násobení |
div | pravidelné dělení ( ne celé číslo! ) |
mod | zbytek divize |
Funkce | Popis |
---|---|
number number(object?) | Převede objekt na číslo |
number sum(node-set) | Vrátí součet množiny. Každý nastavený tag bude převeden na řetězec a bude z něj získáno číslo |
number floor(number) | Vrátí největší celé číslo, které není větší než argument (zaokrouhleno dolů) |
number ceiling(number) | Vrátí nejmenší celé číslo, které není menší než argument (zaokrouhlení nahoru) |
number round(number) | Zaokrouhlí číslo podle matematických pravidel |
Funkce | Popis |
---|---|
node-set document(object, node-set?) | Vrátí dokument zadaný v parametruobject |
string format-number(number, string, string?) | Formátuje číslo podle vzoru zadaného ve druhém parametru. Třetí parametr určuje formát pojmenovaného čísla, který se má vzít v úvahu. |
string generate-id(node-set?) | Vrátí řetězec, který je jedinečným identifikátorem |
node-set key(string, object) | Vrátí sadu se zadaným klíčem (podobně jako funkce idpro identifikátory) |
string unparsed-entity-uri(string) | Vrátí neanalyzovaný identifikátor URI. Pokud žádný není, vrátí prázdný řetězec |
boolean element-available(string) | Zkontroluje, zda je prvek nebo sada zadaná v parametru dostupná. Parametr je považován za XPath |
boolean function-available(string) | Zkontroluje, zda je funkce zadaná v parametru dostupná. Parametr je považován za XPath |
object system-property(string) | Parametry, které vracejí systémové proměnné. Může být:
Pokud je použit neznámý parametr, funkce vrátí prázdný řetězec |
boolean lang(string) | Vrátí true, pokud má aktuální značka atribut xml: langnebo pokud má nadřazená značka atribut xml: langa obsahuje znak, který odpovídá řetězci |
Predikáty jsou logické výrazy v hranatých závorkách sestavené podle stejných principů jako výběrový výraz. Výrazy, které nevrací booleovskou hodnotu, ale prázdnou sadu prvků, jsou považovány za nepravdivé. Výraz, který vrací číslo, je považován za výraz, který porovnává číslo s pozicí(). Pokud existuje více než jeden predikát, každý z nich filtruje výsledky filtrování podle předchozího predikátu.
Označení | Popis |
---|---|
* | Označuje libovolný název nebo znakovou sadu podél zadané osy, například: * - jakýkoli podřízený uzel; @* - jakýkoli atribut |
$name | Přístup k proměnné. name — název proměnné nebo parametru |
[] | Další podmínky výběru (nebo predikát kroku adresování). Musí obsahovat booleovskou hodnotu. Pokud obsahuje číselnou hodnotu, považuje se za pořadové číslo uzlu, což je ekvivalentní předponu tohoto čísla výrazemposition()= |
{} | Pokud se použije uvnitř značky v jiném jazyce (například HTML), procesor XSLT zachází s obsahem složených závorek jako s XPath |
/ | Definuje úroveň stromu, tj. odděluje kroky adresování |
| | Sloučí výsledek. To znamená, že v rámci jedné cesty můžete napsat několik cest analýzy přes znaménko |a výsledek takového výrazu bude zahrnovat vše, co najde kterákoli z těchto cest. |
Dotazovací jazyky | |
---|---|
XSL | |
---|---|
World Wide Web Consortium (W3C) | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Produkty a normy |
| ||||||||||||||
Organizace |
| ||||||||||||||
NA |
| ||||||||||||||
Konference |
|