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

to kolekcja węzłów lub atrybutów o określonym pokrewieństwie wobec węzła kontekstowego.

Znaczenie
ancestordotyczy przodków węzła kontekstowego. Przodkamirodzice węzła kontekstowego, rodzice tych rodziców itd., aż po węzeł główny włącznie
ancestor-or-selfdotyczy węzła kontekstowego i jego przodków
attributedotyczy atrybutów węzła kontekstowego
childdotyczy dzieci węzła kontekstowego
descendantdotyczy potomków węzła kontekstowego. Potomek to dziecko, dziecko dziecka itd.
descendant-or-selfdotyczy węzła kontekstowego i jego potomków
followingdotyczy wszystkich węzłów z dokumentu, do którego należy węzeł kontekstu, które znajdują się po nim
following-siblingdotyczy wszystkich węzłów znajdujących się na tym samym poziomie co węzeł kontekstu, za tym węzłem
namespacedotyczy węzłów przestrzeni nazw węzła kontekstu
parentdotyczy węzła rodzica węzła kontekstowego
precedingdotyczy wszystkich węzłów z dokumentu, do którego należy węzeł kontekstu, które znajdują się przed nim
preceding-siblingdotyczy wszystkich węzłów znajdujących się na tym samym poziomie co węzeł kontekstu, przed tym węzłem
selfzawiera 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łaZnaczenie
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

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

OperatorZnaczenie
!=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.

OperatorZnaczenie
+dodawanie
-odejmowanie
*mnożenie
divdzielenie
modmodulo (reszta z dzielenia pierwszego argumentu przez drugi)

XPath obsługuje także kilka funkcji działających na liczbach:

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

FunkcjaZnaczenie
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żenieSkrót
self::node().
parent::node()..
child::dzieckodziecko
attribute::dziecko@dziecko
/descendant::*//*
dziecko[position() = 3]dziecko[3]
dziecko[position() = last()]dziecko[last()]

Zobacz też

Linki zewnętrzne

Media użyte na tej stronie

XMLSample.png
(c) מאיר מ, CC-BY-SA-3.0
Przykładowy plik XML