XPath

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 8. září 2017; kontroly vyžadují 14 úprav .

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.

Základy

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í:

  • osa (výchozí potomek::, osa prvku). Kromě filtrování podle osy vnořených prvků můžete vybírat podle různých dalších os prvků a podél osy atributu (atribut::, je také označen symbolem @) (viz níže).
  • výraz, který definuje prvky, které mají být vybrány (v příkladu je výběr proveden porovnáním prvků dokumentu s názvy html, body, span a je použit symbol *, který vybere všechny prvky osy)
  • predikáty (v tomto příkladu je to atribut::class) — další podmínky výběru. Může jich být několik. Každý predikát je uzavřen v hranatých závorkách a obsahuje logický výraz pro testování vybraných prvků. Pokud neexistuje žádný predikát, vyberou se všechny odpovídající prvky.

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

Osy jsou základem jazyka XPath. Pro některé osy existují zkratky.

  • child::  - obsahuje sadu následných prvků (prvky umístěné o úroveň níže). Tento název je zkrácen úplně, to znamená, že jej lze úplně vynechat.
  • descendant::  - obsahuje úplnou sadu potomkových elementů (tj. jak nejbližší elementy potomka, tak všechny jejich elementy potomka). Výraz /descendant::node()/lze zkrátit na //.
  • descendant-or-self::  obsahuje úplnou sadu prvků potomka a aktuální prvek. Pomocí této osy je například možné organizovat výběr prvků z libovolného uzlu, a to nejen z kořenového uzlu, jako druhý krok: stačí vzít všechny potomky kořenového uzlu jako První krok. Cesta například //spanvybere všechny uzly v spandokumentu bez ohledu na jejich pozici v hierarchii, přičemž se podívá jak na jméno kořenového prvku, tak na jména všech jeho potomků, až do plné hloubky jejich vnoření.
  • ancestor::  - obsahuje mnoho prvků předka.
  • ancestor-or-self::  obsahuje množinu prvků předka a aktuální prvek.
  • parent::  - obsahuje prvek předka o úroveň zpět. Toto volání lze nahradit..
  • self::  - obsahuje aktuální prvek. Toto volání lze nahradit.
  • následující:  - obsahuje sadu prvků umístěných pod aktuálním prvkem ve stromu (na všech úrovních a vrstvách), s výjimkou jejich vlastních potomků.
  • následující-sibling::  obsahuje sadu sourozeneckých prvků následujících po aktuální vrstvě.
  • předchozí::  - obsahuje množinu prvků nad aktuálním prvkem ve stromu (na všech úrovních a vrstvách), kromě množiny vlastních předků.
  • previous-sibling::  obsahuje sadu sourozeneckých prvků předcházejících aktuální vrstvě.
  • atribut::  - obsahuje sadu atributů aktuálního prvku. Toto vyvolání lze nahradit symbolem@
  • jmenný prostor::  - obsahuje sadu prvků souvisejících s konkrétním jmenným prostorem (tj. existuje atribut xmlns).

Výraz určující prvky, které se mají vybrat

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

  • je zadán konkrétní název, pak jsou vybrány prvky os odpovídající tomuto názvu
  • je zadán symbol *, který vybere všechny prvky osy
  • je zadán výraz složený z funkcí a poté budou vybrány výsledky výpočtu výrazu v kontextu každého prvku osy

Funkce jsou rozděleny do 5 skupin:

Funkce nad sadami uzlů

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

Řetězcové funkce

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.

Booleovské funkce a operátory

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

Číselné funkce a operátory

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

Systémové funkce

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:
  • xsl: version - vrátí XSLT verzi procesoru.
  • xsl: vendor - vrátí výrobce XSLT procesoru.
  • xsl: vendor-url - vrátí URL identifikující výrobce.

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

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.

Další zápisy v XPath

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.

Odkazy