XPath
XPath (ang. XML Path Language, w wolnym tłumaczeniu Język ścieżek XML, Język ścieżek rozszerzalnego języka znaczników) – język służący do adresowania części dokumentu XML.
XPath został oryginalnie zaprojektowany dla XSLT i XPointer, ale znajduje zastosowanie także w DOM oraz językach bazujących na XML, np. XQuery, XUL.
Budowa wyrażeń
Do wskazania w XPath węzła lub zbioru węzłów używa się ścieżki lokalizacji. Ścieżka ta z kolei składa się z jednego lub więcej kroków lokalizacji oddzielanych od siebie znakami / lub //. Jeśli ścieżka zaczyna się od /, nazywamy ją ścieżką bezwzględną, gdyż całą ścieżkę podaje się względem węzła głównego. W przeciwnym wypadku ścieżkę nazywamy względną, zaczyna się ona od bieżącego węzła nazywanego węzłem kontekstowym.
Krok lokalizacji składa się z osi, badania węzła oraz zera lub więcej predykatów. Jeśli np. wyrażenie ma postać
child::n:Kontakt[position()=2]
nazwą osi jest child, badanie węzła to wyrażenie:
n:Kontakt
natomiast zapis:
[position()=2]
to predykat. Ścieżki lokalizacji składać się mogą z jednego lub więcej kroków lokalizacji, np.
/descendant::n:Adresy/child::n:Adres
wybiera elementy n:Adres mające rodzica n:Adresy.
Osie XPath
Oś to kolekcja węzłów lub atrybutów o określonym pokrewieństwie wobec węzła kontekstowego.
Oś | Znaczenie |
---|---|
ancestor | dotyczy przodków węzła kontekstowego. Przodkami są rodzice węzła kontekstowego, rodzice tych rodziców itd., aż po węzeł główny włącznie |
ancestor-or-self | dotyczy węzła kontekstowego i jego przodków |
attribute | dotyczy atrybutów węzła kontekstowego |
child | dotyczy dzieci węzła kontekstowego |
descendant | dotyczy potomków węzła kontekstowego. Potomek to dziecko, dziecko dziecka itd. |
descendant-or-self | dotyczy węzła kontekstowego i jego potomków |
following | dotyczy wszystkich węzłów z dokumentu, do którego należy węzeł kontekstu, które znajdują się po nim |
following-sibling | dotyczy wszystkich węzłów znajdujących się na tym samym poziomie co węzeł kontekstu, za tym węzłem |
namespace | dotyczy węzłów przestrzeni nazw węzła kontekstu |
parent | dotyczy węzła rodzica węzła kontekstowego |
preceding | dotyczy wszystkich węzłów z dokumentu, do którego należy węzeł kontekstu, które znajdują się przed nim |
preceding-sibling | dotyczy wszystkich węzłów znajdujących się na tym samym poziomie co węzeł kontekstu, przed tym węzłem |
self | zawiera węzeł kontekstowy |
Badanie węzłów w XPath
Jako testów węzłów można użyć nazw węzłów, można też uzyć znaku * do wybrania wszystkich elementów. Np. wyrażenie:
child::*/child::n:Email
powoduje wybranie elementów n:Email będących „wnukami” węzła kontekstu. Można też użyć innych testów:
Test węzła | Znaczenie |
---|---|
comment() | wybiera węzły komentarzy |
node() | wybiera węzły dowolnego typu |
processing-instruction() | wybiera węzły instrukcji przetwarzania, w nawiasach można podać także nazwę instrukcji |
text() | wybiera węzły tekstowe |
Predykaty XPath
Predykaty zawierają wyrażenia XPath. Aby otoczyć predykat i przetestować to, czy występuje określony warunek, można użyć operatora []. Można na przykład przestować:
- wartość atrybutu w danym łańcuchu
- wartość elementu
- to czy element zawiera określone „dziecko”, atrybut lub inny element
- pozycję węzła w drzewie
W predykatach można użyć dowolnego rodzaju typu wyrażeń:
- zbiory węzłów
- logiczne
- liczbowe
- tekstowe
- wynikowe fragmenty drzew
Zbiory węzłów XPath
Zbiór węzłów – jak wskazuje sama nazwa - to po prostu zbiór węzłów. Wyrażenie takie jak
n:Zainteresowania
zwraca zbiór węzłów elementów n:Zainteresowania.
Wyrażenie:
child::n:Zainteresowania/child::n:Zainteresowanie
zwraca listę węzłów elementów n:Zainteresowanie będących dziećmi elementów n:Zainteresowania. Do wybrania ze zbioru węzła lub węzłów można użyć różnych funkcji używanych w predykatach.
Funkcje XPath
Funkcja | Znaczenie |
---|---|
last() | zwraca liczbę węzłów w zbiorze |
position() | zwraca położenie węzła kontekstowego w zbiorze węzła kontekstowego |
count(zbiór-węzłów) | zwraca liczbę węzłów w przekazanym zbiorze. Jeśli argument nie zostanie podany, zliczone zostaną węzły zbioru węzła kontekstowego |
namespace-uri(zbiór-węzłów) | zwraca adres URI przestrzeni nazw pierwszego węzła ze zbioru. Pominięcie parametru powoduje uruchomienie funkcji na węźle kontekstowym |
name(zbiór-węzłów) | zwraca pełną kwalifikowaną nazwę pierwszego węzła ze zbioru. Pominięcie parametru powoduje uruchomienie funkcji na węźle kontekstowym |
local-name(zbiór-węzłów) | zwraca nazwę lokalną pierwszego węzła ze zbioru węzłów. Pominięcie parametru powoduje uruchomienie funkcji na węźle kontekstowym |
Wyrażenia logiczne XPath
W wyrażeniach XPath można używać także wyrażeń logicznych. Liczba uważana jest za fałsz, jeśli jest równa zeru i uważana za prawdę w każdym innym przypadku. Napis pusty () uważany jest za fałsz, wszystkie inne napisy odpowiadają prawdzie.
Operatory logiczne XPath umożliwiają wyliczenie wartości typu prawda-fałsz:
Operator | Znaczenie |
---|---|
!= | różne |
< | mniejsze |
<= | mniejsze bądź równe |
= | równe (w odróżnieniu od podwójnego znaku równości == w wielu językach programowania) |
> | większe |
>= | większe bądź równe |
Poszczególne elementy wyrażenia logicznego łączyć można spójnikami and i or, podobnie jak w JavaScripcie i Javie.
Istnieją też funkcje true() i false() zwracające zawsze wartości odpowiednio prawdy i fałszu, a funkcji not() można użyć do odwrócenia logicznej wartości wyrażenia.
Liczby w XPath
Liczby w XPath zapisywane są jako zmiennoprzecinkowe liczby podwójnej precyzji. W takiej postaci przechowywane są wszystkie liczby, nawet liczby całkowite jak np. 2.
Operator | Znaczenie |
---|---|
+ | dodawanie |
- | odejmowanie |
* | mnożenie |
div | dzielenie |
mod | modulo (reszta z dzielenia pierwszego argumentu przez drugi) |
XPath obsługuje także kilka funkcji działających na liczbach:
Funkcja | Znaczenie |
---|---|
ceiling() | Zwraca najmniejszą liczbę całkowitą większą od liczby przekazanej jako parametr |
floor() | Zwraca największą liczbę całkowitą mniejszą od liczby przekazanej jako parametr |
round() | Zaokrągla przekazaną liczbę do najbliższej liczby całkowitej |
sum() | Zwraca sumę przekazanych funkcji liczb |
Napisy w XPath
Napisy XPath składają się ze znaków Unicode. Poniżej zestawiono funkcje operujące na napisach:
Funkcja | Znaczenie |
---|---|
starts-with(s1,s2) | Zwraca prawdę, jeśli napis s1 zaczyna się napisem s2 |
contains(s1,s2) | Zwraca prawdę, jeśli napis s1 zawiera napis s2 |
substring(s,o,i) | Zwraca i znaków napisu s, poczynając od znaku o |
substring-before(s1,s2) | Zwraca część napisu s1 do pierwszego wystąpienia napisu s2 |
substring-after(s1,s2) | Zwraca część napisu s1 od pierwszego wystąpienia napisu s2 poczynając |
string-length(s) | Zwraca liczbę znaków w napisie s |
normalize-space(s) | Zwraca napis s po usunięciu spacji wiodących i końcowych oraz po zamianie wszystkich ciągów kolejnych spacji na pojedyncze spacje |
translate(s,sf,st) | Zwraca napis s po zastąpieniu kolejnych znaków sf kolejnymi znakami napisu st |
concat(s1,s2,…) | Zwraca wszystkie przekazane napisy połączone w całość |
Składnia skrócona XPath
Wyrażenie | Skrót |
---|---|
self::node() | . |
parent::node() | .. |
child::dziecko | dziecko |
attribute::dziecko | @dziecko |
/descendant::* | //* |
dziecko[position() = 3] | dziecko[3] |
dziecko[position() = last()] | dziecko[last()] |
Zobacz też
- DOM - Obiektowy model dokumentu
- XML
- XQuery
- XSL, XSLT
- XPointer
- XUL
Linki zewnętrzne
- Specyfikacja XML Path Language (XPath) Version 1.0
- Specyfikacja XML Path Language (XPath) Version 2.0
- Funkcje i osie XPath
- Tutorial XPath (w języku niemieckim)
- Tutorial XPath (w języku angielskim)
- XSLT i XPath odniesienia (w języku niemieckim)