XPath
-
Pro zopakování a prohloubení znalostí XPathu si samostatně projděte krátký XPath tutoriál.
-
Stáhněte si ukázkové dokumenty.
-
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 funkciid()
, 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 dokumentemkatalog.xml
, ale bude fungovat nad dokumentemkatalog-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
elementufoto
, 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 elementukatalog
, 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 elementukatalog
, 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 elementycena
, 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 textemMiniDisc
. - 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 elementupolozka
, v případě, že elementcena
v položce má atributdph
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á atributdph
nastaven na hodnotu 5. - //cena[2][@dph=’22’]
- Vybere druhý element
cena
, z celého dokumentu, pouze pokud má zároveň atributdph
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.
-
Vyberte všechny elementy jméno – kdekoliv v dokumentu
-
Vyberte psč doručovací adresy
-
Vyberte název všech položek
-
Vypište atributy všech dětí kořenového elementu objednávka
-
Vypište atributy všech potomků kořenového elementu
-
Vypište atributy kořenového elementu i jeho potomků
-
Vypište předky elementu položka, který má cenu 2999
-
Vypište „cestu“ k elementu položka, který má cenu 2999. Cestou se rozumí seznam elementů – předků a samotný element položka.
-
Vypište k položce s cenou 2999 předcházejícího sourozence
-
Vypište k položce s cenou 127.50 následujícího sourozence
-
Spočítejte položky
Úkol na cvičení II
Pro dokument faktura.xml vytvořte postupně následující dotazy.
-
Vypište pouze listové elementy (nemají žádné děti - pouze textový obsah), které obsahují řetězec XML
-
Vypište pouze rodiče listových elementů, které obsahují řetězec XML
-
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)
-
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.
-
Vraťte název první položky
-
Vyberte název položky, jejíž počet se měří v kilogramech
-
Vyberte název položky, jejíž počet se měří v kilogramech a cena je menší než 3000
-
Vyberte všechny děti-elementy první položky
-
Vyberte všechny atributy poslední položky
-
Vyberte všechny typy adres
-
Vyberte všechny elementy
-
Vyberte všechny atributy
-
Vyberte všechny elementy s atributy
-
Vyberte první element, který se nachází za elementem cena
-
Vyberte prvního sourozence, který se nachází za elementem cena
-
Vyberte datum přijetí a doručení (pomocí jednoho xpath dotazu)
-
Zjistěte počet adres
-
Zjistěte počet všech elementů
-
Chce zákazník něco zdarma? (obsahuje element komentář text „zdarma“)?
-
Co chce zdarma? Vypište podřetězec předcházející slovo zdarma.
-
Kolik zaplatí zákazník za dopravu, stojí-li DPD 100 Kč a ostatní druhy dopravy stojí 200 Kč?
-
Vypište všechny elementy, které mají děti