Wprowadzenie do XPath

Transkrypt

Wprowadzenie do XPath
Wprowadzenie do XPath
Tomasz Przechlewski
Spis treści
1.
2.
3.
4.
5.
6.
7.
8.
9.
Model danych .................................................................................................
Model obliczeń ...............................................................................................
Funkcje ...........................................................................................................
Ścieżka dostępu (location path) .....................................................................
Oś (axis) ..........................................................................................................
Test .................................................................................................................
Predykat ..........................................................................................................
Przykłady ........................................................................................................
Dokumentacja/oprogramowanie .....................................................................
1
1
1
2
2
4
5
5
5
1. Model danych
typy zmiennych (object types): boolean, number, string, node-set (4);
typy węzłów (node types): root, element, atrribute, namespace, pi, comment, text
(7);
2. Model obliczeń
Wyrażenie XPath jest obliczane w kontekście, na który składają się m.in. dokument,
węzeł kontekstowy, pozycja węzła kontekstowego (context position) oraz liczebność
zbioru węzłów (context size), środowisko zmiennych i funkcji.
Wyrażenia XPath: arytmetyczne, napisowe, logicznych, ścieżkowe. Wyrażenia mogą
zawierać następujące operatory/operandy:
• Operatory arytmetyczne: + - * div mod. Nawiasy: ()
• Operatory logiczne: <=, <, >=, >, =, =! and or
• Operatory dla zbiorów węzłów: |
• $nazwa jest odwołaniem do zmiennej o nazwie nazwa. Zmienna musi być dostępna
w kontekście w momencie obliczania wyrażenia.
• Wywołania funkcji (szczegóły poniżej)
3. Funkcje
<!-- Funkcje : -->
<!-- konwersja: -->
boolean(val) => boolean ; number(val) => number ; string(val) => napis
1
Wprowadzenie do XPath
<!-- arytmetyczne : -->
ceiling, floor, round
<!-- napisowe: -->
concat(v1, v2, ... ) => napis
contains(val, substring) => boolean
start-with("Pinarello", "Pi") => true
string-length() => number
substring("Pinarello Dogma", 11) => "ello Dogma"
substring("Pinarello Dogma", 6, 3) => "ell"
substring-after("print=yes", "=") => "yes"
substring-before("print=yes", "=") => "print"
translate("XYZ-12:01", "-:", "!&") => "XYZ!12&01"
<!-- agregacja: -->
count(zbiór-węzłów) => liczba
sum(zbiór-węzłów) => liczba
<!-- kontekst: -->
last() => number
position() => number
4. Ścieżka dostępu (location path)
Ścieżka dostępu ma następującą składnię:
[/]krok[/krok]*
W powyższym zapisie [foo] oznacza, że 'foo' jest opcjonalny. Znak * oznacza 0 lub
więcej powtórzeń tego co jest przed *.
Każdy krok to sekwencja:
oś::test[[predykat]*]
Obliczenie wyrażenia zaczyna się od węzła konktekstowego (context node) lub węzła dokumentu (jeżeli ścieżka zaczyna się od /). Każdy krok wyrażenia ścieżkowego
wyznacza zbiór-węzłów względem węzła kontekstowego. Każdy węzeł w tym zbiorze jest węzłem kontekstowym dla wyznaczenia zbioru węzłów w następnym kroku.
Wynikiem całej ścieżki jest zbiór węzłów, która jest wynikiem ostatniego kroku.
Oś ,,zgrubnie'' określa jakiś zbiór-węzłów. Test węzłów pozwala na wybranie tylko
niektórych węzłów z danej osi. Predykaty to dowolne wyrażenia dodatkowo filtrujące
węzły.
5. Oś (axis)
Każda oś wskazuje zbiór węzłów. Kolejność węzłów w zbiorze jest zgodna lub przeciwna do ich wystąpienia w dokumencie (w zależności od tego czy oś jest w przód
czy w tył -- większość osi jest ,,w przód''). Osi jest 13.
2
Wprowadzenie do XPath
ancestor::
przodek
ancestor-or-self::
połączenie osi ancestor i self
attribute::
atrybuty węzła kontekstowego
child::
zawiera dzieci węzła kontekstowego. Jedynie węzeł dokumentu i elementu mają
dzieci (mogą to być elementy, instrukcje przetwarzania, komentarze, lub węzły
tekstowe; dziećmi nie są atrybuty, przestrzenie nazw i węzły dokumentu)
parent::
rodzic węzła kontekstowego
self::
węzeł kontekstowy
descendant::
potomkowie
descendant-or-self::
połączenie osi descendant i self
following::
potomkowie węzła dokumentu nie będący potomkami węzła kontekstowego
i w dokumencie występujący po nim
following-sibling::
rodzeństwo, które zgodnie z porządkiem dokumentu występuje później (dla węzłów atrybutu i przestrzeni nazw ta oś jest pusta)
namespace::
węzły przestrzeni nazw
preceding::
potomkowie węzła dokumentu nie będący potomkami węzła kontekstowego
i w dokumencie występujący przed nim
preceding-sibling::
rodzeństwo, które zgodnie z porządkiem dokumentu występuje wcześniej (dla
węzłów atrybutu i przestrzeni nazw ta oś jest pusta)
składnia uproszczona: `nic' -- child::; @ -- attribute::; / -- root.
3
Wprowadzenie do XPath
Rysunek 1. Osie (środkowy węzeł p jest węzłem kontekstowym)
root
memo
to
...
from
...
body
p
...
close
p
...
p
q
...
...
...
6. Test
Zasadniczo są dwa rodzaje testów: po rodzaju węzła i po nazwie.
nazwa
węzły o nazwie nazwa
prefix:nazwa
węzły o nazwie nazwa w przestrzeni nazw wskazanej prefiksem prefix
*
węzły o dowolnej nazwie lokalnej
prefiks:*
węzły o dowolnej nazwie lokalnej w przestrzeni nazw wskazanej prefiksem prefix
node()
dowolne węzły
text()
dowolne węzły tekstowe
comment()
węzły komentarza
processing-instruction(), processing-instruction(napis)
węzły instrukcji przetwarzania
składnia uproszczona: // -- /descendant-or-self::node()/; . -- self::node();
.. -- parent::node().
4
Wprowadzenie do XPath
7. Predykat
Predykatem może być dowolne wyrażenie XPath. Jeśli jego wynikiem jest liczba, to
liczba ta jest niejawnie porównywana z pozycją testowanego węzła (tj. [liczba] jest
skrótem od [position()=liczba]. Każdy inny (nieliczbowy) wynik jest zamieniany
na wartość typu xs:boolean. W szczególności pusta zbiór-węzłów to fałsz, a niepusty to prawda. Przykłady:
8. Przykłady
para
elementy para, dzieci w. bieżącego;
*
wszystkie elementy dzieci w. bieżącego;
text()
wszystkie w. tekstowe dzieci w. bieżącego;
@*
wszystkie atrybuty dzieci w. bieżącego;
@name
atrybut name, dziecko w. bieżącego;
para[1]
pierwszy węzeł para
para[last()]
ostatni węzeł para
/article/chapter[4]/section[2]
chapter//para
//para
../@lang
para[@type='warning'][5] para[5][@type='warning']
9. Dokumentacja/oprogramowanie
• James Clark, Steve DeRose: XML Path Language (XPath), W3C Recommendation,
16 November 1999 http://www.w3.org/TR/xpath/
• Daniel Veillard: The XML C parser and toolkit of Gnome http://xmlsoft.org/.
Ten dokument w formacie: pdf [./xml-xpath.pdf] oraz xml [./xml-xpath.xml].
5