1. Pro zopakování a prohloubení znalostí XPathu si samostatně projděte krátký XPath tutoriál.

  2. Stáhněte si ukázkové dokumenty.

  3. Na ukázkovém dokumentu katalog.xml (případně faktura.xml) si vyzkoušejte některé z následujících dotazů. Pro testování výrazů XPath můžete použít nástroje zabudované do editoru.

    katalog
    Vybere všechny elementy katalog, které jsou dětmi aktuálního uzlu.
    ./katalog
    Vybere všechny elementy katalog, které jsou dětmi aktuálního uzlu.
    /katalog
    Vybere všechny elementy katalog, které jsou dětmi kořenové uzlu. Takový element může být v dokumentu maximálně jeden a je to kořenový element.
    *
    Vybere všechny elementy, které jsou dětmi aktuálního uzlu.
    katalog/*
    Vybere všechny elementy, které jsou dětmi elementu katalog, který je dítětem aktuálního uzlu.
    text()
    Vybere všechny textové uzly, které jsou dětmi aktuálního uzlu.
    //text()
    Vybere všechny textové uzly v celém dokumentu.
    id(‘mz-r90’)
    Vybere uzel, který má atribut typu ID nastaven na hodnotu mz-r90. Pokud chceme používat funkci id(), musíme mít k dokumentu připojené DTD, ve kterém mají některé z atributů typ ID. Tato funkce proto nebude fungovat nad dokumentem katalog.xml, ale bude fungovat nad dokumentem katalog-s-id.xml, který obsahuje DTD s požadovanou definicí typu atributu.
    @href
    Vybere atribut href aktuálního uzlu.
    foto/@href
    Vybere atribut href elementu foto, který je dítětem aktuálního uzlu.
    @*
    Vybere všechny atributy aktuálního uzlu.
    //*[@*]
    Vybere všechny elementy dokumentu, které mají alespoň jeden atribut.
    polozka[1]
    Vybere první element polozka, který je dítětem aktuálního uzlu.
    /katalog/polozka[1]
    Vybere první element polozka, který je dítětem elementu katalog, který je kořenovým elementem dokumentu.
    polozka[last()]
    Vybere poslední element polozka, který je dítětem aktuálního uzlu.
    */nazev
    Vybere všechny elementy nazev, které jsou vnoučaty (dětmi dětí) aktuálního uzlu.
    katalog//cena
    Vybere všechny elementy cena, které jsou potomky elementu katalog, který je dítětem aktuálního uzlu.
    //cena
    Vybere všechny elementy cena, které jsou potomky kořenového uzlu. To v praxi znamená, že jsou vybrány všechny elementy cena, které se nacházejí ve stejném dokumentu jako aktuální uzel.
    .
    Vybere aktuální uzel.
    ..
    Vybere rodiče aktuálního uzlu.
    id(‘mz-r90’)/../info/firma
    Pomocí `..’ se lze velice jednoduše pohybovat vzhůru ve struktuře dokumentu.
    /katalog/polozka[kategorie=’MiniDisc’]
    Vybere element polozka, který je dítětem kořenového elementu katalog, pokud obsahuje jako dítě element kategorie s textem MiniDisc.
    self::polozka
    Vybere aktuální uzel, pokud je to element se jménem polozka.
    preceding::*[1]
    Vybere poslední element, který se nachází před aktuálním uzlem.
    preceding-sibling::*[1]
    Vybere poslední element, který se nachází před aktuálním uzlem a je na stejné úrovni (je to sourozenec).
    following::*[1]
    Vybere první element, který se nachází za aktuálním uzlem.

    Na ukázkovém dokumentu faktura.xml si vyzkoušejte následující dotazy:

    //polozka[cena/@dph=’5’]/popis
    Vybere všechny elementy popis, které jsou dětmi elementu polozka, v případě, že element cena v položce má atribut dph nastaven na 5.

    Lidsky řečeno vybere popis všech položek faktury, které mají 5% sazbu DPH.

    //cena[@dph=’5’][2]
    Vybere druhý element cena, z celého dokumentu, který má atribut dph nastaven na hodnotu 5.
    //cena[2][@dph=’22’]
    Vybere druhý element cena, z celého dokumentu, pouze pokud má zároveň atribut dph nastaven na hodnotu 22. Omezující podmínky v hranatých závorkách jsou tedy vyhodnocovány postupně zleva doprava.

Úkol na cvičení I

Pro dokument objednavka.xml vytvořte postupně následující dotazy.

  1. Vyberte všechny elementy jméno – kdekoliv v dokumentu

  2. Vyberte psč doručovací adresy

  3. Vyberte název všech položek

  4. Vypište atributy všech dětí kořenového elementu objednávka

  5. Vypište atributy všech potomků kořenového elementu

  6. Vypište atributy kořenového elementu i jeho potomků

  7. Vypište předky elementu položka, který má cenu 2999

  8. Vypište „cestu“ k elementu položka, který má cenu 2999. Cestou se rozumí seznam elementů – předků a samotný element položka.

  9. Vypište k položce s cenou 2999 předcházejícího sourozence

  10. Vypište k položce s cenou 127.50 následujícího sourozence

  11. Spočítejte položky

Úkol na cvičení II

Pro dokument faktura.xml vytvořte postupně následující dotazy.

  1. Vypište pouze listové elementy (nemají žádné děti - pouze textový obsah), které obsahují řetězec XML

  2. Vypište pouze rodiče listových elementů, které obsahují řetězec XML

  3. Jaká je celková hodnota objednávky (pozor na měnu) BEZ DPH. Pro USD počítejte kurz 18,50 kč/USD (jiné měny neuvažujte)

  4. Výsledek předchozího dotazu zaokrouhlete na celé číslo nahoru

Domácí úkol

XPath

Pro dokument objednavka.xml vytvořte postupně následující dotazy.

  1. Vraťte název první položky

  2. Vyberte název položky, jejíž počet se měří v kilogramech

  3. Vyberte název položky, jejíž počet se měří v kilogramech a cena je menší než 3000

  4. Vyberte všechny děti-elementy první položky

  5. Vyberte všechny atributy poslední položky

  6. Vyberte všechny typy adres

  7. Vyberte všechny elementy

  8. Vyberte všechny atributy

  9. Vyberte všechny elementy s atributy

  10. Vyberte první element, který se nachází za elementem cena

  11. Vyberte prvního sourozence, který se nachází za elementem cena

  12. Vyberte datum přijetí a doručení (pomocí jednoho xpath dotazu)

  13. Zjistěte počet adres

  14. Zjistěte počet všech elementů

  15. Chce zákazník něco zdarma? (obsahuje element komentář text „zdarma“)?

  16. Co chce zdarma? Vypište podřetězec předcházející slovo zdarma.

  17. Kolik zaplatí zákazník za dopravu, stojí-li DPD 100 Kč a ostatní druhy dopravy stojí 200 Kč?

  18. Vypište všechny elementy, které mají děti