XPath – Zadania, część 5 – Funkcje

Jest to piąta część z cyklu XPath – Zadania, który ma na celu przetestować Twoją wiedzę z zakresu wyrażeń XPath na różnych przykładach.

Zadania tu zebrane dotyczą głównie funkcji, ale bazują też na wyrażeniach poruszonych w poprzednich częściach. XML, na którym bazują zadania, wraz z aplikacją pozwalającą na testy wyrażeń XPath, dostępny jest pod adresem XPath Playground. Teraz, gdy mamy już wszystkie narzędzia gotowe możemy przystąpić do rozwiązywania zadań…

Zatem do dzieła! 🙂

P.S. Ściąga z wyrażeń XPath dostępna jest na stronie XPath cheat sheet 😉

Zadanie 1 – Szukanie po początku tekstu

Znajdź wszystkie elementy typu book, których title zaczyna się od litery T.

Oczekiwany wynik

         The Lord of the Rings
         J. R. R. Tolkien
         1954
         45.00
      ,

         The Dark Tower: The Gunslinger
         Stephen King
         1987
         30.00
      ,

         The Dark Tower II: The Drawing of the Three
         Stephen King
         1982
         30.99
      ,

         The Shining
         Stephen King
         1977
         45.00
      ,

         The Wind-Up Bird Chronicle
         Haruki Murakami
         1994
         55.99

Podpowiedź
Do wyszukiwania elementów, których wartość zaczyna się od podanych liter, używamy funkcji starts-with()
Rozwiązanie
//book[starts-with(title,"T")]

Zadanie 2 – Szukanie po początku tekstu

Znajdź wszystkie elementy typu title, które zaczynają się od litery T.

Oczekiwany wynik
The Lord of the Rings,
The Dark Tower: The Gunslinger,
The Dark Tower II: The Drawing of the Three,
The Shining
Podpowiedź
Do wyszukiwania elementów, których wartość zaczyna się od podanych liter, używamy funkcji starts-with()
Rozwiązanie
//title[starts-with(text(),"T")]

Zadanie 3 – Szukanie po fragmencie tekstu

Znajdź wszystkie elementy typu title, które zawierają w sobie słowo Dark.

Oczekiwany wynik
The Dark Tower: The Gunslinger,
The Dark Tower II: The Drawing of the Three
Podpowiedź
Do wyszukiwania elementów, które zawierają dany tekst, używamy funkcji contains()
Rozwiązanie
//title[contains(text(),"Dark")]

Zadanie 4 – Szukanie po fragmencie tekstu

Znajdź wszystkie elementy typu book, których element author zawiera w sobie słowo Tolkien.

Oczekiwany wynik

         The Lord of the Rings
         J. R. R. Tolkien
         1954
         45.00
      
Podpowiedź
Do wyszukiwania elementów, które zawierają dany tekst, używamy funkcji contains().
Rozwiązanie
//book[contains(author,"Tolkien")]

Zadanie 5 – Szukanie po długości tekstu

Znajdź wszystkie elementy typu title, których tekst jest dłuższy niż 32 znaki.

Oczekiwany wynik
The Dark Tower II: The Drawing of the Three,
How to prepare your garden for Eternal Autumn
Podpowiedź
Do sprawdzania długości tekstu elementów używamy funkcji string-length().
Rozwiązanie
//title[string-length(text()) > 32]

Zadanie 6 – Szukanie po nazwach elementów

Znajdź wszystkie elementy, których nazwa zaczyna się od litery a.

Oczekiwany wynik
Frank Herbert,
J. R. R. Tolkien,
Winston Groom,
Jacek Dukaj,
Jacek Doe,
Stephen King,
Stephen King,
John Doe,
Stephen King,
John Brooklyn Sawyer,
Ryū Murakami,
Bethany Covenant,

            Discipline: Way of freedom
         ,

            Codex 10
         
Podpowiedź 1
Do wyszukiwania elementów, których wartość zaczyna się od podanych liter, używamy funkcji starts-with().
Podpowiedź 2
Do pobrania wartości elementu/węzła służy funkcja name().
Rozwiązanie
//*[starts-with(name(), 'a')]

Zadanie 7 – Szukanie po nazwach elementów

Znajdź wszystkie elementy typu title, których nazwa nie zaczyna się od litery C, D i T.

Oczekiwany wynik
Forrest Gump,
Perfekcyjna Niedoskonałość,
Robot Bob,
How to program stuff,
How to program other stuff,
In the miso soup,
How to prepare your garden for Eternal Autumn,
Heavy matter
Podpowiedź 1
Do wyszukiwania elementów, których wartość zaczyna się od podanych liter, używamy funkcji starts-with().
Podpowiedź 2
Do zaprzeczeń służy funkcja not().
Rozwiązanie
//title[not(starts-with(text(), 'C') or starts-with(text(), 'D') or starts-with(text(), 'T'))]

Zadanie 8 – Zliczanie elementów

Znajdź wszystkie elementy typu book, które nie zawierają w sobie elementu author.

Oczekiwany wynik

         Discipline
         
            Discipline: Way of freedom
         
         120.00
      ,

         Discipline II
         125.00
      ,

         Heavy matter
         1854
         99.00
      
Podpowiedź
Do zliczania elementów używamy funkcji count().
Rozwiązanie nr. 1
//book[count(author)=0]
Rozwiązanie nr. 2
//book[not(author)]

Zadanie 9 – Pozycja elementu

Pobierz element typu book, który znajduje się na drugiej pozycji na liście w elemencie shelves.

Oczekiwany wynik

         The Lord of the Rings
         J. R. R. Tolkien
         1954
         45.00

Podpowiedź
Do pobierania elementu z listy używamy funkcji position()
Rozwiązanie 1
//shelves/book[position()=2]
Rozwiązanie 2
//shelves/book[2]

Zadanie 10 – Zaokrąglanie wartości

Pobierz element typu book, którego cena price po zaokrągleniu wynosi 56.

Oczekiwany wynik

         The Wind-Up Bird Chronicle
         Haruki Murakami
         1994
         55.99
      
Podpowiedź
Do zaokrąglania wartości używamy funkcji round()
Rozwiązanie
//book[round(price) = 56]

Zadanie 11 – Zliczanie liczby elementów

Policz liczbę elementów typu book, które znajdują się w shelves.

Oczekiwany wynik
7
Podpowiedź
Do zliczania liczby elementów używamy funkcji count()
Rozwiązanie
count(//shelves/book)

Zadanie 12 – Pobieranie nazwy elementów

Wyświetl nazwę pierwszego elementu w elemencie book, który znajduje się w shelves.

Oczekiwany wynik
title
Podpowiedź
Do pobierania nazwy elementu używamy funkcji name()
Rozwiązanie
name(//shelves/book/*[1])

Zadanie 13 – Sumowanie

Oblicz sumę wartości price wszystkich elementów typu book, które znajdują się w shelves.

Oczekiwany wynik
220.99
Podpowiedź
Do obliczania sumy używamy funkcji sum()
Rozwiązanie
sum(//shelves/book/price)

10 komentarzy

  1. Hej,
    Czy w zadaniu 7 w zadaniu nie powinno być: “Znajdź wszystkie elementy typu “title”, których nazwa nie zaczyna się od litery C, D i T. A nie “wszystkie elementy”?

    Zad. 8 – rozwiązanie: //book[count(author)=0]
    Zdaje się, że innym rozwiązaniem jest: //book[not(author)]

    Avatar Piotr
    1. Hej,
      Zad 7. – faktycznie, polecenie powinno zostać doprecyzowane. Dzięki za zgłoszenie – poprawie od razu 🙂

      Zad 8. – zgadza się, to też jest poprawne rozwiązanie. Dodam je jako jedną z możliwości 🙂

      Krzysiek Kijas Krzysiek Kijas
  2. Pytanie do zadania 10 tego
    //shelves/book[position()=2]
    //shelves/book[2]
    powyzsze rozwiązania są rownoważne .
    Rozumiem że funkcja position przydaje się wtedy gdy chcemy na przykład wybrać elementy które znajdują się na pozycji > 2,
    Bo czegoś takiego za pomacą indeksów nie uda się wykonać.

    Avatar aaa
    1. Tak, jak najbardziej 🙂 Bardzo często dany problem/zadanie z XPatha można rozwiązać na kilka różnych sposobów, gdzie każdy z nich jest poprawny 🙂

      Pozdrawiam,

      Krzysiek Kijas Krzysiek Kijas
  3. Hej,
    Czy w “Zadanie 1 – Szukanie po początku tekstu” nie powinno być jeszcze piątego wyniku? Tzn.

    The Wind-Up Bird Chronicle
    Haruki Murakami
    1994
    55.99

    Również jest na ‘T’ 🙂

    Druga sprawa: W treści polecenia jest “Znajdź wszystkie elementy, których title zaczyna się od litery T.”, natomiast w rozwiązaniu widzimy “//book[…]”. Dla obecnego XMLa nie ma to różnicy, jednakże ‘magazine’ też mogłoby mieć tytuł zaczynający się na literę T. Chyba, że w treści miało być “Znajdź wszystkie książki (…)” 😉

    Avatar Grzesiek P
    1. Hej,
      Bardzo dobre spostrzeżenia! 😀 W obu przypadkach się zgadza – powinno być 5 wyników, gdyż faktycznie jest pięć pozycji zaczynających się od ‘T’. Dodatkowo faktycznie zadanie jest mało precyzyjnie opisane, gdyż w innych “zbiorach” (czyli np magazynach) takie elementy mogą się pojawić 😉

      Dzięki za zgłoszenie, od razu poprawiamy!
      Pozdrawiam,

      Krzysiek Kijas Krzysiek Kijas
  4. W zadaniu 4 jest chyba błąd bo zgodnie z treścią zadania “Znajdź wszystkie elementy typu book, których tytuł title zawiera w sobie słowo Tolkien.” nie ma książki która ma w title – “Tolkien”. Nie powinno tam być “author” = “Tolkien” ?

    Avatar Michał Gozdur

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *