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