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 RingsJ. R. R. Tolkien195445.00,
The Dark Tower: The GunslingerStephen King198730.00,
The Dark Tower II: The Drawing of the ThreeStephen King198230.99,
The ShiningStephen King197745.00,
The Wind-Up Bird ChronicleHaruki Murakami199455.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 RingsJ. R. R. Tolkien195445.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
DisciplineDiscipline: Way of freedom120.00,
Discipline II125.00,
Heavy matter185499.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 RingsJ. R. R. Tolkien195445.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 ChronicleHaruki Murakami199455.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
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)]
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ć.
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 (…)” 😉
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,
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” ?
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)]
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 🙂
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ć.
Hej,
Zgadza się 🙂
czy do zadania 4 moze byc odpowiedź:
//book//author[contains(text(),”Tolkien”)]’
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,
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 (…)” 😉
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,
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” ?
Dzięki za zwrócenie uwagi. Masz rację – powinno być “author”.
Już poprawiłem 😀