4 TVEZEWXYHMNR LSTVSKVEQY-RJSVQEXMOENITSHTSVSZ RETVSNIOXIQRERGSZER Q ^)ZVSTWO LSWSGM PR LSJSRHYEVS^TS XYLPEZR LSQ WXE4VEL] 4VELE)9-RZIWXYNIQIHSZE% 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čí. Nerespektuje strukturu dokumentu. Historie 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 Je součástí mnoha dalších technologií (XSLT, XLink, ). XQuery jazyk vycházející z SQL (pro složité dotazy) BI-TWA XPath a XSLT 2
XPath XPath (v 1.0) Jednoduchý dotazovací jazyk nad XML Syntaxe dotazu není vyjádřena v XML Zápis se podobá cestě v adresářové struktuře Analogie podadresářů a podelementů 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 Množina uzlů DOM stromu Množina řetězců Číslo (float) Pravdivostní hodnota (ano/ne) BI-TWA 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ř: 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 BI-TWA XPath a XSLT 4
XPath osy preceding ancestor preceding-sibling parent 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. Typové testy jsou např. text() (textový uzel) nebo comment(). 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. Uzel se zařadí do výsledku, pouze pokud všechny predikáty daného kroku vrátí true. BI-TWA 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ě. Volání funkce je také XPath dotaz. 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. +, -, *, div, mod, and, or, <, >, =,!=, BI-TWA 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 ".." Jako v adresářové struktuře. "//" 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]). Tzn. foo[3]/bar[5] je 5. bar uvnitř 3. foo v rámci kontext. elementu. Příklad co hledá následující dotaz?..//chapter[@title="intro"]/para[last()] BI-TWA 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í? nejsou vedoucí ani členové skupiny ani nadřízení BI-TWA 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í? nejsou vedoucí ani členové skupiny ani nadřízení BI-TWA 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í? nejsou vedoucí ani členové skupiny ani nadřízení BI-TWA 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í? nejsou vedoucí ani členové skupiny ani nadřízení BI-TWA 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í? nejsou vedoucí ani členové skupiny ani nadřízení BI-TWA 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) Schéma je založeno na příkazech FOR, LET, WHERE, ORDER BY a RETURN. 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. XQuery bylo původně určeno pro velké XML databáze. XSLT je složitější a nabízí silnější prostředky. BI-TWA XPath a XSLT 17
Transformace a prezentace XML
XSL a prezentace XML Problém s prezentací XML dat Např. HTML lze snadno prezentovat. Používá dobře známé značky, které prohlížeč umí zobrazit. Vzhled se snadno modifikuje CSS XML dovoluje návrh vlastních značek. Prohlížeč neví, jak kterou značku zobrazit. XSL (Extensible Stylesheet Language) Řeší otázku prezentace libovolných XML dat. Mnohem silnější než CSS (umožňuje libovolné změny v datech). XSL = XSLT + XSL-FO (+ XPath) XSLT jazyk pro transformace dokumentů. XSL-FO speciální sada značek (formátovacích objektů) BI-TWA 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. Nový XML dokument HTML dokument Čistě textový soubor BI-TWA 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=" " /> A také šablony BI-TWA XPath a XSLT 21
XSLT Šablony Definují se elementem <xsl:template>. Template musí mít definovaný atribut match nebo name. match definuje XPath dotaz, který vybírá uzly pro šablonu. name pojmenovává šablonu, aby na ni šlo později odkázat. 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. 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. Pravidla jsou poměrně komplikovaná (viz reference XSLT). Na počátku se vybírá šablona, která odpovídá celému dokumentu. BI-TWA XPath a XSLT 22
XSLT Vkládání hodnot Hodnoty lze do šablon vkládat elementem <xsl:value-of />. Podmínky 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ě. 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:if> <xsl:choose> <xsl:when test="expr">...</xsl:when>... <xsl:otherwise>...</xsl:otherwise> </xsl:choose> Příklad 1 BI-TWA XPath a XSLT 23
Cykly XSLT 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 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 BI-TWA 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) Pro každý uzel zvlášť se vybírá šablona, která mu vyhovuje nejvíc. 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... /> Hodnota parametru je definována v těle nebo atributem select. Parametry jsou přístupné v XPath dotazech volané šablony ($param). BI-TWA 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: <xsl:element name="..."> vytvoří element <xsl:attribute name="..."> přidá elementu atribut <xsl:text> vloží do výstupu text Příklad 3 BI-TWA 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/> </xsl:template> Rekurzivně zpracuje děti. <xsl:template match="text() @*"> <xsl:value-of select="."/> </xsl:template> Atributy a text vypíše. Komentáře a P.I. se odstraní. <xsl:template match="processing-instruction() comment()"/> Příklad 4 BI-TWA XPath a XSLT 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. <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="adresar.xsl"?> <adresar>...</adresar> 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 Pokud prohlížeč neumí ani XML, ani JavaScript Např. třída XSLTProcessor v PHP BI-TWA 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 <?xml version="1.0" encoding="utf-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> <fo:layout-master-set> <fo:simple-page-master master-name="a4">...</fo:simp...>... </fo:layout-master-set> <fo:page-sequence master-reference="a4">... </fo:page-sequence> </fo:root> Obsah stránky Seznam formátovacích šablon pro stránky BI-TWA 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í: 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, ). V rámci jednoho bloku lze obsah formátovat různě. Klasický text, tabulky, seznamy, Blok může mít i další parametry (podobné CSS). Font, barvy, okraje, odsazení, Do výstupu je možné vkládat foreign objekty (např. obrázky). BI-TWA XPath a XSLT 30
XSL složitější transformace XML dokument HTML dokument WML stránky plain text Prohlížeč XSLT procesor XSL-FO dokument XSL formatter PDF XSLT XSLT šablona XSLT šablona šablona 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. Např. záznamy o obchodování na burze. Záznamy o obchodních transakcích exportují do XML. Každý má vlastní formát (schéma). Otázka integrace 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í 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. BI-TWA XPath a XSLT 32
XSLT další příklad použití Lokální XML formát XSLT XSLT Lokální XML formát univerzál. XML formát Lokální XML formát XSLT XSLT Lokální XML formát BI-TWA XPath a XSLT 33
Další informace www.w3c.org WWW Consortium vydavatel standardů, které se týkají XML. 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 Známý český popularizátor a publicista (nejen) XML. Nakladatelství O'Reilly Vydalo řadu pěkných knih o XML a souvisejících technologiích. BI-TWA XPath a XSLT 34