4 °TVEZE WXYHMNR°LS TVSKVEQY -RJSVQEXMOE NI TSHTSVSZ¤RE TVSNIOXIQ RERGSZERÀQ ^ )ZVSTWO¬LS WSGM¤PR°LS JSRHY E VS^TSÐXY LPEZR°LS QÞWXE 4VEL] 4VELE
)9 -RZIWXYNIQI HS ZE%° FYHSYGRSWXM
Dotazování nad XML daty a jazyk XPath BI-TWA Peter Vojtáš prezentaci připravil Martin Kruliš
Dotazování nad XML daty
Problém dotazování
XML je jazyk na ukládání strukturovaných dat. Předpokládá se, že bude potřeba v datech také vyhledávat. Fulltextové vyhledávání nestačí.
Historie
Nerespektuje strukturu dokumentu.
Do roku 1998 se vyvíjely XML-QL a XQL (neustálený vývoj).
Dnes se používá
XPath (1.0 a 2.0) – jednoduchý dotazovací jazyk
BI-TWA
Je součástí mnoha dalších technologií (XSLT, XLink, …).
XQuery – jazyk vycházející z SQL (pro složité dotazy) XPath a XSLT
2
XPath
XPath (v 1.0)
Jednoduchý dotazovací jazyk nad XML Syntaxe dotazu není vyjádřena v XML
Dotaz se vyhodnocuje nad XML DOM stromem
Případně podobnou strukturou, která je celá v paměti.
Výsledkem XPath dotazu může být
BI-TWA
Zápis se podobá cestě v adresářové struktuře Analogie podadresářů a podelementů
Množina uzlů DOM stromu Množina řetězců Číslo (float) Pravdivostní hodnota (ano/ne)
XPath a XSLT
3
XPath
Kontext vyhledávání
Každý XPath dotaz je vyhodnocován v rámci kontextu. Kontext je definován:
Kontextovým uzlem (elementem), v rámci kterého se vyhledává. Dalšími parametry (rozsah, proměnné, …).
Osy (axes) – definice „směru“ vyhledávání
Osy definují relativní pohyb po dokumentu. Např:
BI-TWA
child – přímý syn uzlu (toto je výchozí osa) descendant – potomek uzlu (v libovolné hloubce) parent – přímý rodič (obdobně ancestor – předek) following-sibling – následující uzel na stejné úrovni preceding – předchozí uzly (v pořadí definovaném dokumentem) attribute – uzel typu atribut XPath a XSLT
4
XPath – osy preceding
ancestor
parent preceding-sibling
following-sibling
self
namespace
child
attribute
following
descendant descendant-or-self BI-TWA
XPath a XSLT
5
XPath – formát dotazu
Formát dotazu
Základní dotaz se skládá z „kroků“, které jsou oddělené lomítkem.
Začíná-li lomítkem, bere se místo kontextu kořen dokumentu.
Jeden krok je definován jako osa::test[predikát]
Osa určuje, v jakém směru se krok provádí. Testem může být jméno (elementu, atributu, …) nebo typ.
Predikáty filtrují výsledek a může jich být lib. mnoho.
Do výsledku se zahrnou všechny uzly, které kroku vyhovují.
Např. child::foo vybere všechny potomky s názvem foo.
Predikáty mají tvar [výraz], kde výraz je vnořený XPath dotaz.
Výsledek dotazu se převádí na boolean (pokud je třeba). Predikát se testuje v každém uzlu, který vyhovuje zvolenému kroku.
BI-TWA
Typové testy jsou např. text() (textový uzel) nebo comment().
Uzel se zařadí do výsledku, pouze pokud všechny predikáty daného kroku vrátí true. XPath a XSLT
6
XPath – příklady
Příklady jednoduchých dotazů:
Všechny elementy s názvem foo, které jsou vnuky kontext. elem. child::*/child::foo
Elementy bar, které jsou dětmi lib. foo (v celém dokumentu) /descendant::foo/child::bar
Všechny atributy bar všech následujících elementů foo following::foo/attribute::bar
Všechny následující elementy foo, které vlastní atribut bar following::foo[attribute::bar]
Všechny elementy title, které mají textový obsah „Úvod“ /descendant::title[child::text()='Úvod'] Všechny děti foo a bar kontextového uzlu child::*[self::foo or self::bar]
BI-TWA
XPath a XSLT
7
XPath – vestavěné funkce
Vestavěné funkce a operátory
XPath obsahuje knihovnu vestavěných funkcí. Volání funkce lze použít téměř na libovolném místě.
Příklady:
string(), number(), boolean() – převede argument na jiný typ count(expr) – vrací počet uzlů vrácený dotazem „expr“ position() – pozice kontextového uzlu v rámci svých sousedů last() – index posledního uzlu v daném kontextu id(id) – vrací množinu uzlů s daným ID (ID atributu dle DTD) concat(), substr() – zřetězení a podřetězec sum(nodes) – převede hodnoty daných uzlů na čísla a sečte je
V rámci výrazů lze také používat běžné operátory.
BI-TWA
Volání funkce je také XPath dotaz.
+, -, *, div, mod, and, or, <, >, =, !=, … XPath a XSLT
8
XPath – zkrácená syntax
Zkrácená syntax
Většina os má volitelný kratší zápis:
child je výchozí a není třeba jej uvádět (child::foo ~ foo) self::* má zkratku "." a parent::* má zkratku ".."
"//" je zkratka za "/descendant-or-self::node()/"
Tedy //foo vyhledá všechny elementy foo v celém dokumentu. Naopak .//bar vyhledá elementy bar jen v rámci kontextového elementu.
attribute má zkratku "@" (attribute::bar ~ @bar).
Zkrácené predikáty
Existuje pouze zkratka pro pozici ([position() = 42] ~ [42]).
Jako v adresářové struktuře.
Tzn. foo[3]/bar[5] je 5. bar uvnitř 3. foo v rámci kontext. elementu.
Příklad – co hledá následující dotaz?
BI-TWA
..//chapter[@title="Intro"]/para[last()] XPath a XSLT
9
XPath – příklady
Příklady dotazů nad databází zaměstnanců
Který zaměstnanec je definovaný uprostřed seznamu zaměstnanců?
Zaměstnanci, kteří vedou víc než jednu skupinu?
ID pana Mitkina?
V kolika skupinách je Mitkin členem?
Skupiny, které nemají vedoucího?
Lidé, kteří nic nedělají?
nejsou vedoucí ani členové skupiny ani nadřízení zamestnanci.xml
BI-TWA
XPath a XSLT
10
XPath – příklady
Příklady dotazů nad databází zaměstnanců
Který zaměstnanec je definovaný uprostřed seznamu zaměstnanců? //zamestnanec[position()=ceiling(last() div 2)]
Zaměstnanci, kteří vedou víc než jednu skupinu?
ID pana Mitkina?
V kolika skupinách je Mitkin členem?
Skupiny, které nemají vedoucího?
Lidé, kteří nic nedělají?
BI-TWA
nejsou vedoucí ani členové skupiny ani nadřízení
XPath a XSLT
11
XPath – příklady
Příklady dotazů nad databází zaměstnanců
Který zaměstnanec je definovaný uprostřed seznamu zaměstnanců? //zamestnanec[position()=ceiling(last() div 2)]
Zaměstnanci, kteří vedou víc než jednu skupinu? //zamestnanec[count(vedouci) > 1]
ID pana Mitkina?
V kolika skupinách je Mitkin členem?
Skupiny, které nemají vedoucího?
Lidé, kteří nic nedělají?
BI-TWA
nejsou vedoucí ani členové skupiny ani nadřízení
XPath a XSLT
12
XPath – příklady
Příklady dotazů nad databází zaměstnanců
Který zaměstnanec je definovaný uprostřed seznamu zaměstnanců? //zamestnanec[position()=ceiling(last() div 2)]
Zaměstnanci, kteří vedou víc než jednu skupinu? //zamestnanec[count(vedouci) > 1]
ID pana Mitkina? string(//zamestnanec[prijmeni='Mitkin']/@id)
V kolika skupinách je Mitkin členem?
Skupiny, které nemají vedoucího?
Lidé, kteří nic nedělají?
BI-TWA
nejsou vedoucí ani členové skupiny ani nadřízení
XPath a XSLT
13
XPath – příklady
Příklady dotazů nad databází zaměstnanců
Který zaměstnanec je definovaný uprostřed seznamu zaměstnanců? //zamestnanec[position()=ceiling(last() div 2)]
Zaměstnanci, kteří vedou víc než jednu skupinu? //zamestnanec[count(vedouci) > 1]
ID pana Mitkina? string(//zamestnanec[prijmeni='Mitkin']/@id)
V kolika skupinách je Mitkin členem? count(//skupina[clen/@id = string(//zamestnanec[prijmeni='Mitkin']/@id)])
Skupiny, které nemají vedoucího?
Lidé, kteří nic nedělají?
BI-TWA
nejsou vedoucí ani členové skupiny ani nadřízení
XPath a XSLT
14
XPath – příklady
Příklady dotazů nad databází zaměstnanců
Který zaměstnanec je definovaný uprostřed seznamu zaměstnanců? //zamestnanec[position()=ceiling(last() div 2)]
Zaměstnanci, kteří vedou víc než jednu skupinu? //zamestnanec[count(vedouci) > 1]
ID pana Mitkina? string(//zamestnanec[prijmeni='Mitkin']/@id)
V kolika skupinách je Mitkin členem? count(//skupina[clen/@id = string(//zamestnanec[prijmeni='Mitkin']/@id)])
Skupiny, které nemají vedoucího? //skupina[not(//zamestnanec/vedouci/@skupina = @id)]
Lidé, kteří nic nedělají?
BI-TWA
nejsou vedoucí ani členové skupiny ani nadřízení
XPath a XSLT
15
XPath – příklady
Příklady dotazů nad databází zaměstnanců
Který zaměstnanec je definovaný uprostřed seznamu zaměstnanců? //zamestnanec[position()=ceiling(last() div 2)]
Zaměstnanci, kteří vedou víc než jednu skupinu? //zamestnanec[count(vedouci) > 1]
ID pana Mitkina? string(//zamestnanec[prijmeni='Mitkin']/@id)
V kolika skupinách je Mitkin členem? count(//skupina[clen/@id = string(//zamestnanec[prijmeni='Mitkin']/@id)])
Skupiny, které nemají vedoucího? //skupina[not(//zamestnanec/vedouci/@skupina = @id)]
Lidé, kteří nic nedělají?
nejsou vedoucí ani členové skupiny ani nadřízení
//zamestnanec[not(vedouci or (//skupina/clen/@id = @id) or (//zamestnanec/@vedouci = @id))] BI-TWA
XPath a XSLT
16
XQuery
XQuery
Složitější dotazovací jazyk vydaný W3C v lednu 2007. Je nadmnožinou XPath 2.0 a vývoj byl koordinován i s XSLT. Konstruktivní syntax (podobná např. SQL)
Jednotlivé bloky využívají XPath k vybírání částí XML dokumentu. Výstupem může být téměř cokoli (např. nově zkonstruovaný XML dokument). Na rozdíl od XPath dovoluje např. deklarovat vlastní funkce.
XQuery je funkčně podobné XSLT.
BI-TWA
Schéma je založeno na příkazech FOR, LET, WHERE, ORDER BY a RETURN.
XQuery bylo původně určeno pro velké XML databáze. XSLT je složitější a nabízí silnější prostředky.
XPath a XSLT
17
Transformace a prezentace XML
XSL a prezentace XML
Problém s prezentací XML dat
Např. HTML lze snadno prezentovat.
XML dovoluje návrh vlastních značek.
Používá „dobře známé“ značky, které prohlížeč umí zobrazit. Vzhled se snadno modifikuje CSS Prohlížeč neví, jak kterou značku zobrazit.
XSL (Extensible Stylesheet Language)
Řeší otázku prezentace libovolných XML dat.
XSL = XSLT + XSL-FO (+ XPath)
BI-TWA
Mnohem silnější než CSS (umožňuje libovolné změny v datech).
XSLT – jazyk pro transformace dokumentů. XSL-FO – speciální sada značek (formátovacích objektů)
XPath a XSLT
19
XSLT XML dokument XSLT procesor
Výsledný dokument (XML, HTML nebo plain text)
XSLT
XSL Transformations
Jazyk popisující transformace XML dokumentů.
Transformace je uložena opět jako XML dokument. Výstupem transformace může být.
BI-TWA
Nový XML dokument HTML dokument Čistě textový soubor XPath a XSLT
20
XSLT
Princip fungování
Transformace se skládá ze šablon.
Každá šablona vyhledává části původního dokumentu pomocí XPath. Následně popisuje, co se má z nalezeného fragmentu sestavit.
Zápis transformace
Dokument je uzavřen v kořenovém elementu: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Uvnitř se nachází elementy, které nastavují parametry zpracování.
<xsl:output method="text|html|xml" /> <xsl:include href="…" />, <xsl:import href="…" />
…
BI-TWA
A také šablony… XPath a XSLT
21
XSLT
Šablony
Definují se elementem <xsl:template>.
Template musí mít definovaný atribut match nebo name.
Uvnitř je také možné používat další konstrukce XSLT (např. cykly).
Pokud je šablon více, vybírá se ta, která nejlépe vyhovuje zpracovávanému uzlu.
BI-TWA
Volitelně může mít také definovanou priority.
Obsahem šablony je text a elementy, které se vygenerují do výstupu, když je šablona použita.
match – definuje XPath dotaz, který vybírá uzly pro šablonu. name – pojmenovává šablonu, aby na ni šlo později odkázat.
Pravidla jsou poměrně komplikovaná (viz reference XSLT). Na počátku se vybírá šablona, která odpovídá celému dokumentu.
XPath a XSLT
22
XSLT
Vkládání hodnot
Hodnoty lze do šablon vkládat elementem <xsl:value-of />.
Element má atribut select, který obsahuje XPath dotaz.
XPath dotaz se vyhodnotí, převede na string a vloží do výstupu.
Kontextový uzel pro dotaz odpovídá uzlu, který se zpracovává v šabloně.
Příklad 1
Podmínky
Nabízí standardní možnosti větvení šablon. Podmínka je vyjádřena v XPath (převádí se na boolean výraz). <xsl:if test="expr"> ... <xsl:choose> <xsl:when test="expr">... ... <xsl:otherwise>...
BI-TWA
XPath a XSLT
23
XSLT
Cykly
Cyklus se vytváří konstrukcí <xsl:for-each select="…">.
Atribut select obsahuje XPath dotaz, jehož výsledkem je množina uzlů. Tělo cyklu se provede pro každý uzel z množiny.
While-cyklus není v XSLT definován, ale lze jej nahradit rekurzí.
Třídění
Uvnitř cyklu je možné uvést element <xsl:sort>, který definuje, v jakém pořadí mají být uzly zpracovány. Důležité atributy
BI-TWA
select – XPath dotaz vracející data, která se budou porovnávat. data-type – typ dat (jak se mají porovnat). order – určuje pořadí (vzestupně/sestupně). Příklad 2 XPath a XSLT
24
XSLT
Rekurzivní zpracování a volání šablon
V rámci šablony je možné nechat rekurzivně zpracovat děti zdrojového uzlu voláním <xsl:apply-templates />.
Volitelně může definovat XPath výraz (které uzly mají být zpracovány)
Uvnitř apply-templates lze použít element sort (jako u cyklu).
Pojmenované šablony je také možné volat <xsl:call-template>.
Atribut name definuje, která šablona se má volat. Kontext zpracovávaného uzlu zůstává stejný. Volání může definovat parametry <xsl:with-param ... />
BI-TWA
Pro každý uzel zvlášť se vybírá šablona, která mu vyhovuje nejvíc.
Hodnota parametru je definována v těle nebo atributem select. Parametry jsou přístupné v XPath dotazech volané šablony ($param).
XPath a XSLT
25
XSLT
Proměnné
Definují se konstrukcí <xsl:variable name="...">.
Hodnotu mají definovanou v těle elementu nebo přes atribut select.
Hodnoty proměnných se nedají měnit.
Nastavené proměnné lze používat v XPath dotazech ($variable).
Proměnné můžou být globální i lokální (def. v rámci jedné šablony).
Složitější techniky vytváření výstupu
V některých situacích je potřeba poskládat výstupní elementy s možností větší kontroly. K tomu slouží speciální elementy:
BI-TWA
Příklad 3
<xsl:element name="..."> – vytvoří element <xsl:attribute name="..."> – přidá elementu atribut <xsl:text> – vloží do výstupu text XPath a XSLT
26
XSLT
Vestavěná pravidla
Aby bylo možné šablony jednoduše spojovat rekurzí (pomocí apply-templates), je definováno několik vestavěných pravidel.
Tato pravidla se používají vždy (nejde je zrušit).
<xsl:template match="*|/"> <xsl:apply-templates/>
Rekurzivně zpracuje děti.
<xsl:template match="text()|@*"> <xsl:value-of select="."/>
Atributy a text vypíše.
Komentáře a P.I. se odstraní.
<xsl:template match="processing-instruction()|comment()"/>
BI-TWA
XPath a XSLT
Příklad 4
27
XSLT
Časté způsoby použití – zobrazení v prohlížeči
Provázání prezentačních dat s XML souborem
Odkaz na transformační skript se zapisuje těsně za preambuli.
...
Ruční transformace skriptem
Na straně klienta
Použití např. JavaScriptu (např. objekt XSLTProcessor())
Vhodné např. pro fragmenty XHTML v technologii AJAX
Na straně serveru
BI-TWA
Pokud prohlížeč neumí ani XML, ani JavaScript Např. třída XSLTProcessor v PHP
XPath a XSLT
28
XSL-FO
XSL Formatted Objects
Sada XML elementů sloužících k formátování výstupu. Jsou orientovány na sazbu (tj. řeší detailně např. i rozměry).
Na rozdíl např. od HTML, které může být zobrazeno různě.
Struktura XSL-FO dokumentu
... ...
...
BI-TWA
Seznam formátovacích šablon pro stránky
Obsah stránky XPath a XSLT
29
XSL-FO
Vlastnosti formátování
Veškerý obsah (text, obrázky, …) se při formátování chová jako obdélníková oblast. Existují různé typy oblastí:
V rámci jednoho bloku lze obsah formátovat různě.
BI-TWA
Klasický text, tabulky, seznamy, …
Blok může mít i další parametry (podobné CSS).
Page – veškerý obsah je formátován na stránky (logické celky). Region – stránka se dále dělí na regiony (záhlaví, zápatí, tělo, …). Block – obsah se seskupuje do bloků (blok je např. jeden odstavec). Line – reprezentuje obsah na jednom řádku. Inline – oblasti na nejnižší úrovni v rámci řádku (jednotlivé znaky, …).
Font, barvy, okraje, odsazení, …
Do výstupu je možné vkládat „foreign“ objekty (např. obrázky). XPath a XSLT
30
XSL – složitější transformace HTML
plain text
WML
stránky
…
dokument
XML
dokument
Prohlížeč XSL-FO
XSLT procesor
dokument
XSL formatter
XSLT XSLT XSLT šablona
šablona šablona
PDF
TeX
zdrojový kód TeX
BI-TWA
XPath a XSLT
31
XSLT – další příklad použití
Příklad problému
Řada firem pracuje s daty ze stejné domény.
Záznamy o obchodních transakcích exportují do XML.
Každý má vlastní formát (schéma).
Otázka integrace
Např. záznamy o obchodování na burze.
Firmy potřebují začít komunikovat i mezi sebou. Změna interních systémů (formátů) může být velmi nákladná.
Řešení
BI-TWA
Definujeme univerzální XML formát, který zahrnuje prvky všech zúčastněných firem. Každá firma si pouze vytvoří XSLT transformace z a do univerzálního formátu. XPath a XSLT
32
XSLT – další příklad použití Lokální XML formát
Lokální XML formát XSLT
XSLT
univerzál. XML formát
Lokální XML formát
BI-TWA
XSLT
XSLT
XPath a XSLT
Lokální XML formát
33
Další informace
www.w3c.org
www.w3schools.com
Pěkné tutoriály (a stručné reference) v angličtině týkající se XML, webu a jiných technologií, zejména od W3C.
Jiří Kosek – knihy i web
WWW Consortium – vydavatel standardů, které se týkají XML.
Známý český popularizátor a publicista (nejen) XML.
Nakladatelství O'Reilly
BI-TWA
Vydalo řadu pěkných knih o XML a souvisejících technologiích. XPath a XSLT
34