Słowem wstępu Standard: W3C XPath 1.0-1999 razem XSLT 1.0 XPath 2.0-2007 razem z XQuery 1.0 i XSLT 2.0 XPath 3.0-2014 trwają prace nad XPath 3.1
XPath Język deklaratywny służący wskazywaniu elementów, atrybutów, lub całych fragmentów dokumentu XML Osie (ang. axes) oraz predykaty pozwalają wyselekcjonować pojedynczą ścieżką wiele miejsc w dokumencie XML, co nawiązuje do funkcji oferowanych przez języki zapytań
Wykorzystanie XPath został oryginalnie zaprojektowany dla XSLT, ale znajduje zastosowanie językach bazujących na XML, np. XQuery. W XML Schema w celu zapewnienia unikatowości elementów i atrybutów key, unique, keyref
Podstawy XPath Dokument jako drzewo. XPath zawiera około 100 wbudowanych funkcji. Pozwalają one na operacje na ciągach znakowych, wartościach liczbowych, obsługują czas i daty etc. fn:day-from-datetime(datetime) fn:upper-case(string) fn:ceiling(num) fn:true() Razem formułują tzw. XML Data Model (XDM)
Podstawy XPath Wyrażenia służą do wybierania węzłów i zbiorów w dokumentach XML. Wyrażenia są bardzo podobne do wyrażeń stosowanych do nawigacji w tradycyjnych systemach komputerowych /Catalog/Artist/Album /Catalog/Artist[2]/Album
Składnia kierunek podwójny dwukropek: :: symbole specjalne (np. *, /, @,..), nazwy elementów, albo funkcje: node() text() comment() processing-instruction() dowolna liczba predykatów umieszczonych w nawiasach kwadratowych: [ ]
Budowa wyrażeń XPath Ścieżka (ciąg określający) XPath jest zbudowana z tzw. kroków (step), oddzielonych symbolem /. Pojedynczy krok może reprezentować element, atrybut lub funkcję. Poszczególne kroki zawężają obszar przeszukiwania drzewa DOM
Kontekst XPath Wyrażenia danego kroku działają w kontekście określanym przez kroki poprzednie. Na kontekst składają się: Bieżący węzeł (tzw. context node) Dwie dodatnie liczby naturalne (pozycja kontekstu context position oraz rozmiar kontekstu context size - ilość węzłów w danym kontekście) Zmienne Biblioteka dostępnych funkcji
Relacje między węzłami XPath operuje na drzewie DOM, czyli na strukturze hierarchicznej. Pierwszym węzłem jest element główny dokumentu XML wraz z jego zawartością. Selekcja atrybutów wzdłuż lub wszerz drzewa DOM określana jest tzw. osiami (axes) Operatory stosowane do selekcji pojedynczych elementów: self aktualny węzeł (zwany kontekstem: context node) parent rodzic aktualnego węzła; attribute - wybór wartości atrybutu danego węzła
Relacje między węzłami (2) Operatory stosowane do wyboru kolekcji elementów: child bezpośrednie podelementy descendant całe drzewo podelementów poniżej aktualnego descendant-or-self j.w. plus aktualny węzeł ancestor przodkowie aktualnego węzła ancestor-or-self j.w. plus aktualny węzeł following-sibling kolejne węzły na tym samym poziomie hierarchii preceding-sibling wcześniejsze węzły na tym samym poziomie
Przykład /descendant::dzial[attribute::id = 234 ]/ child::pracownik[1]/child::text()
Więcej przykładów /child::osoby/child::osoba[child::imie = 'Jan'] /child::osoba[child::imie = 'Jan']/ child::nazwisko //obiekt[attribute::nazwa][3]
Skróty oś child można pominąć / Wybiera korzeń dokumentu - ścieżka bezwględna // Wybiera węzeł w dokumencie, nieważne gdzie się znajduje zamiast attribute można użyć @. zamiast self::node().. zamiast parent::node()
Przykład //dzial[@id = 234 ]/pracownik[1]/text()
Więcej przykładów /osoby/osoba[@imie = 'Jan'] osoba[@imie = 'Jan']/nazwisko //obiekt[@nazwa][3]
Podstawowe wyrażenia Ścieżki mogą być bezwzględne lub względne /krok1/krok2/krok3 krok1/krok2
Predykaty wyszukiwania Predykaty zmieniają pozycję i rozmiar kontekstu Występują opcjonalnie, umieszczane wewnątrz nawiasów kwadratowych celem zawężenia zwróconego zbioru elementów Muszą zwracać wartość logiczną Dostępne operatory logiczne: =!= > >= < <= and or not
Predykaty wyszukiwania (2) Dostępne operatory arytmetyczne: + - * div mod //produkt[@cena*1.22 < 1000] Można wyszukiwać węzły wg. ich pozycji, podając predykat np. [position()=2] skracalny do postaci [2] Indeksacja zaczyna się od 1
Porównania Równość nie jest przechodnia Nierówność nie jest zaprzeczeniem równości Argumenty poddawane są atomizacji Dla typów atomowych porównania są intuicyjne
Porównania (1,2) = (1,2) //true (1,2) = (2,3) //true (1,2)!= (1,2) //true ()!=() //false ()=() //false
Porównania Równość nie jest przechodnia Nierówność nie jest zaprzeczeniem równości Argumenty poddawane są atomizacji Dla typów atomowych porównania są intuicyjne Jeśli porównywane są sekwencje to wystarczy jedna para spełniająca kryterium, aby wyrażenie było prawdziwe
Predykaty wyszukiwania (3) concat(łańcuch1, łańcuch2, ) contains(łańcuch, wzorzec) normalize-space(łańcuch) starts-with(łańcuch, wzorzec) string-length(łańcuch) substring(łańcuch, od, do), substring-after(łańcuch, wzorzec), substring-before(łańcuch, wzorzec), translate(łańcuch, stare, nowe), string( ) => konwersja na string;
Predykaty wyszukiwania (4) Operacje na liczbach: ceiling(liczba), floor(liczba), round(liczba), sum(zbiór_węzłów), number( ) -> konwersja na typ liczbowy Operacje na wartościach logicznych: false(), true(), not(); boolean( ) -> konwersja na typ logiczny Operacje na węzłach: count(zbiór_węzłów) last() position() id(identyfikator) -> wyszukiwania węzła po identyfikatorze name(element) namespace-uri(element)
Przykłady bookstore Wybiera wszystkie węzły w elemencie bookstore /bookstore Wybiera główny element bookstore Jeśli wyrażenie zaczyna się od ukośnika (/) to zawsze musi reprezentować element główny bookstore/book Wybiera wszystkie elementy book, które są dziećmi elementu bookstore //book Wybiera wszelkie elementy o nazwie book, nieistotne gdzie są umiejscowione bookstore//book wybiera wszelkie elementy o nazwie book, nieistotne gdzie są umiejscowione o ile są potomkami elementu bookstore //@lang Wybiera wszystkie atrybuty lang
Przykłady (2) /bookstore/book[1] Wybiera pierwszy element book, który jest dzieckiem elementu głównego bookstore /bookstore/book[last()] Wybiera ostatni element book, który jest dzieckiem elementu głównego bookstore /bookstore/book[last()-1] Element przedostatni /bookstore/book[position()<3] Pierwsze dwa elementy
Przykłady (3) //title[@lang] Wybiera wszelkie elementy title, które posiadają atrybut lang //title[@lang= en ] Wybiera wszelkie elementy title, które posiadają atrybut o nazwie lang, którego wartością jest en /bookstore/book[price>35.00] Wybiera elementy book, które posiadają element price o wartości większej niż 35.00 /bookstore/book[price>35.00]/title Wybiera elementy title z elementów /bookstore/book, które posiadają element price o wartości większej niż 35.00
Wildcards * Znaczy każdy element @* Każdy atrybut node() Każdy rodzaj węzła
Wildcards - przykłady /bookstore/* Wszystkie podelementy bookstore //* Wszystkie elementy dokumentu //title[@*] Wszystkie elementy title, które posiadają jakikolwiek atrybut Wybór kilku ścieżek poprzez użycie operatora //book/title //book/price Wybiera elementy title i price z elementów book //title //price Wybiera elementy title i price z całego dokumentu
Rzutowanie typów xs:date("2001-08-25") - typy np. z XSL xs:float("10.23") adresy:kod_pocztowy("48-200")
Co nowego w XPath 2.0 XPath 1.0 uwzględniał tylko 4 typy danych: node-set (nieuporządkowany zbiór elementów) boolean number (liczba zmiennoprzecinkowa) string Możliwość uwzględniania schematu XML (w wersji 2.0) -> obsługa typów danych Sekwencje -> wszystko jest sekwencją
Co nowego w XPath 3.0 i 3.1 łańcuchy wywołań contains(upper-case(substring-before($in, ' ')), 'X') $in => substring-before(' ') => upper-case() => contains('x') unie bezpośrednie odwołania do zewnętrznych przestrzeni nazw Q{http://www.w3.org/2005/xpath-functions/math}pi
Ograniczenia XPath Nie można wyszukiwać łańcuchów znaków rozciągających się poprzez kilka elementów (np. przy zawartości mieszanej) Brak możliwości wskazania na znaczniki początkowy i końcowy; Brak możliwości wyszukiwania encji i sekcji CDATA Brak możliwości wskazywania punktów lub zakresów w tekście. Nie można zadeklarować oczekiwanego sortowania Nie można przeprowadzać operacji agregacji
Podsumowanie XPath jest to język, który: Pozwala na posługiwanie się dokumentem XML jak drzewem katalogowym Posiada możliwość korzystania ze zmiennych, atomizacji, obliczeń, sekwencji, kwalifikatorów, funkcji Posiada możliwość definiowania osi, testów i predykatów Jest używany w XQuery, XSLT etc.