XPath – Wikipedia, wolna encyklopedia

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ń

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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

Znaczenie
ancestor dotyczy 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-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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]
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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]
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ż

[edytuj | edytuj kod]

Linki zewnętrzne

[edytuj | edytuj kod]