290 likes | 419 Views
Stylový jazyk XSL část 1. Magdalena Raszková Ústav informatiky PEF MZLU v Brně xraszkov @pef.mendelu.cz. Proč vůbec používat styly?. XML umožňuje strukturovat data uložená v dokumentu, neříká nám však nic o jejich vzhledu princip oddělení obsahu dokumentu od jeho vzhledu
E N D
Stylový jazyk XSLčást 1 Magdalena Raszková Ústav informatiky PEF MZLU v Brně xraszkov@pef.mendelu.cz
Proč vůbec používat styly? • XML umožňuje strukturovat data uložená v dokumentu, neříká nám však nic o jejich vzhledu • princip oddělení obsahu dokumentu od jeho vzhledu • potřeba převodu XML dokumentu do formátu vhodného pro vlastní prezentaci • můžeme vytvořit vlastní program pro zpracování dat v XML ... • použít modul nějakého programovacího jazyka • využijeme technologii XSL ;-)
Proč vůbec používat styly? • připojení různých stylů k jednomu XML dokumentu • Výhoda při aktualizaci • Přizpůsobení různým koncovým zařízením (monitor, tisk, PDA, mobil, …)
Proč vůbec používat styly? • připojení jednoho stylu k různým XML dokumentům • Dosažení jednotného vzhledu • Změna vzhledu úpravou jednoho stylu
XSL (eXtensible Stylesheet Language) • stylový jazyk speciálně vyvinutý pro XML • specifikace XSL je dílem konsorcia W3C • původně jedna specifikace, která zajišťovala jak transformaci dokumentů, tak i jejich formátování • později vymezeny 2 samostatné části, které spolu ale úzce souvisí: • transformační část: XSLT (Transformation) • formátovací část: XSL-FO (Formatting Objects) • definuje vizuální vlastnosti objektů a dokumentu – formátování výstupu • transformace do formátu PDF, PS • tyto dvě části doplněny ještě o jazyk XPath – dohromady označováno jako XSL Family
Opakování – XPath Vyberte umělý kořen stromové reprezentace (neodpovídá žádnému elementu, jeho dítětem je vždy kořenový element dokumentu) / Vyberte všechny elementy knihovna, které jsou dětmi kořenové uzlu (jinak řečeno kořenový element) /knihovna Vyberte všechny elementy kniha, které jsou dětmi aktuálního uzlu kniha ./kniha Vyberte elementy nazev, které jsou dětmi elementu kniha kniha/nazev Vyberte všechny elementy nazev, které jsou potomky kořenového uzlu //nazev
Opakování – XPath Vyberte všechny elementy, které jsou dětmi aktuálního uzlu * Vybere všechny elementy, které jsou dětmi elementu kniha kniha/* Vyberte aktuální element . Vyberte rodiče aktuálního uzlu (pohybujeme se vzhůru ve struktuře dokumentu) .. Vyberte všechny textové uzly v celém dokumentu //text() Vybere atribut kat_cislo aktuálního uzlu @kat_cislo
Transformační část – XSLT • výkonný jazyk pro přímou manipulaci s obsahem dokumentů XML • pomocí XSLT lze jednoduchým způsobem transformovat vstupní XML dokument na rozličné výstupní formáty • umožňuje definovat transformaci XML dokumentu na jiný dokument XML s odlišnou strukturou a značkami • převod na další typy dokumentů: • HTML, XHTML • RTF • obyčejný textový soubor • kód v jazyku JavaScript • sekvence SQL příkazů • zdrojový kód pro TeX • dokumenty XSL-FO… • verze XSLT • XSLT 1.0 – doporučení (recommendation) • XSLT 2.0 – od 23. ledna 2007 také ve formě doporučení
Editace XSL stylu • jde o čistě textový formát • jakýkoliv textový editor (Notepad, Emacs, …) • XML editory • XMetaL • Epic • XMLSpy • XMLwriter • XMLmind • Stylus Studio XML Enterprise Suite • Cooktop – budeme používat (umožňuje XSLT transformace, má zabudovaný procesor MSXML) • a další
Elementy v XSLT stylu • specifikace definuje 35 elementů rozdělených do 3 kategorií: • kořenový element <xsl:stylesheet> • elementy nejvyšší úrovně (top-level elements) • mohou být přímými potomky elementu <xsl:stylesheet> • <xsl:attribute-set> • <xsl:template> • <xsl:variable> • <xsl:output> a další • instrukční elementy • stejně jako v XML dokumentu je možné v XSL stylu použít komentáře <!-- komentar -->
Kořenový element XSLT stylu • stylový soubor je validní XML dokument, který obsahuje kořenový element <xsl:stylesheet> • v kořenovém elementu je určen jmenný prostor, všechny elementy XSL pak začínají prefixem xsl <?xml version="1.0" encoding="windows-1250"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ... </xsl:stylesheet>
Výstupní metody <xsl:output> • pomocí elementu <xsl:output> lze nastavit typ výstupního dokumentu • atributy elementu <xsl:output> určují nastavení hlavičky výstupního dokumentu • method: typ výstupního dokumentu • xml • text • html • encoding, version, standalone: hodnoty v hlavičce XML • doctype-public: veřejný identifikátor • doctype-public: systémový identifikátor • indent: formátovaný výstup, odsazené elementy • omit-xml-declaration: vložit či nevložit XML hlavičku • všechny atributy jsou nepovinné
Výstupní metody <xsl:output> Zápis v XSL stylu: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" method="xml" encoding= "windows-1250" doctype-system= "http://www.w3c.org/TR/xhtml1/DTD/xhtml11.dtd" doctype-public= "-//W3C//DTD XHTML 1.1//EN"/> Hlavička výstupního dokumentu pak vypadá následovně: <?xml version="1.0" encoding="windows-1250"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml11.dtd">
Šablony <xsl:template>1/3 • základem každého XSL stylu jsou šablony (template) <xsl:templatematch="vzor"> tělo šablony </xsl:template> • hodnotou atributu match je výraz jazyka XPath (vzor), kterým vybíráme určitý uzel nebo skupinu uzlů ze zdrojového XML dokumentu • v těle šablony je pak určeno, jak bude vybraný uzel (skupina uzlů) zpracován • tělo šablony může obsahovat znaková data, instrukce jazyka XSLT či další elementy (pravidla)
Šablony <xsl:template>2/3 • jakmile procesor XSLT nalezne ve zdrojovém XML dokumentu uzel, který odpovídá zadanému vzoru, stane se nalezený uzel kontextovým uzlem dané šablony • všechny operace uvnitř šablony jsou pak vykonávány vzhledem k tomuto uzlu • na aktuální uzel se lze odkazovat pomocí . <xsl:template match="nazev"> <b> <xsl:value-of select="."/> </b> </xsl:template>
Šablony <xsl:template>3/3 Poznámka: • Pro vyvolávání šablon je důležité pořadí elementů v XML dokumentu a nikoliv pořadí šablon v XSL stylu. • Na uspořádání šablon v XSL stylu tedy ve většině případů nezáleží.
Příklad šablony XML dokument <knihovna> <kniha>Jiskraživota</kniha> <kniha>Jericho</kniha> </knihovna> šablona v XSL stylu <xsl:template match="kniha"> Jméno knihy je <xsl:apply-templates/> <br/> </xsl:template> Výstupem bude dokument obsahující text Jméno knihy je Jiskra života<br/> Jméno knihy je Jericho<br/>
Instrukce <xsl:apply-templates> • slouží pro zpracování vnořených uzlů (potomků) • zavoláním <xsl:apply-templates>se začnou hledat šablony pro všechny děti kontextového uzlu <xsl:template match="kniha"> <xsl:apply-templates/> </xsl:template> <xsl:template match="nazev"> <i><xsl:apply-templates/> </i> </xsl:template> <xsl:template match="autor"> <b><xsl:apply-templates/> </b> </xsl:template>
Načítání hodnoty atributů • instrukce <xsl:apply-templates> automaticky nezpracuje dětské uzly, kterými jsou atributy nebo jmenné prostory • musíme je uvést jako hodnotu atributu select pomocí prefixu @ a příslušného názvu <xsl:template match="kniha"> Katalogové číslo: <xsl:value-of select="@kat_cislo"/> </xsl:template>
např. autor | nazev | cena Implicitní šablony • XSLT procesory mají v sobě zabudovaných několik tzv. implicitních šablon (default rule) • pokud po zavolání <xsl:apply-templates> pro nějaký uzel není nalezena uživatelem definovaná šablonu, použije se implicitní šablona • díky implicitní šabloně se na výstup zkopírují veškeré textové uzly, které nebyly zpracovány žádnou uživatelem definovanou šablonou • jak tomu zamezit (pokud se nám to nehodí): • prázdné šablony: <xsl:template match="autor"/> (filtrování) • <xsl:apply-templates select="výraz"/> Pozn.: IE verze 5.5 a dřívější implicitní pravidla nepodporuje
Instrukce <xsl:value-of> • využijeme, pokud chceme v těle šablony použít jen textový obsah nějakého elementu či jeho podelementů, ale nechceme aplikovat další šablony • umožňuje přístup přímo k hodnotě uzlu (použití např. při vytváření tabulek) • většinou používáno v dokumentech, které nemají příliš složitoua variabilní strukturu • vybere pouze obsah textových uzlů, které jsou potomky elementu určeného pomocí výrazu • instrukce je vždy prázdná <xsl:template match="kniha"> <p>Knihu <xsl:value-of select="nazev"/> jsem ještě nečetla.</p> </xsl:template>
Instrukce <xsl:for-each> • slouží pro cyklické zpracování všech elementů získané sady uzlů (použití při vytváření tabulek apod.) • uvnitř cyklu se mění aktuální uzel <xsl:template match="/"> <table> <xsl:for-each select="kniha"> <tr> <td> <xsl:value-of select="nazev"/> </td> <td> <xsl:value-of select="cena"/> </td> </tr> </xsl:for-each> </table> </xsl:template>
Instrukce <xsl:text> • ze stylu jsou před zpracováním vypuštěny všechny textové uzly, které obsahují pouze bílé znaky • instrukce <xsl:text> slouží pro vkládání doslovného textu do výstupu (včetně bílých znaků) • instrukce může obsahovat pouze textový uzel • využívá se hlavně pro vkládání mezer <xsl:template match="kniha"> <p> <xsl:value-of select="autor"/> <xsl:text>: </xsl:text> <xsl:value-of select="nazev"/> </p> </xsl:template>
Zápis znaků < > • znaky < a > se používají pro oddělení tagů od okolního textu • proto je uvnitř hodnoty elementu nemůžeme zapsat přímo, ale musíme použít tzv. znakové entity • Znak < znaková entita < • Znak > znakováentita > Pozn.: nezlomitelná mezera – entita  
Konflikt šablon • pokud pro jeden uzel dokumentu existuje několik šablon: • šablonám lze nastavit atribut priority – XSLT procesor pak použije šablonu s vyšší prioritou • Pokud priorita není nastavena ručně, odvodí je XSLT procesor pomocí určitých pravidel • pokud mají šablony stejnou prioritu • procesor zahlásí chybu nebo • použije poslední definovanou šablonu
Realizace transformací • uvnitř klientského programu • transformace pomocí prohlížeče • Mozilla FireFox • Internet Explorer 6.0 • verze Internet Exploreru 5.x podporují pouze starší verzi návrhu standardu • styl se připojuje ke XML dokumentu pomocí instrukce <?xml-stylesheet?> uvedené za hlavičkou XML dokumentu <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="styl.xsl"?> <knihovna> ... </knihovna> Pozn.: Internet Explorer je schopen provést transformaci pouze pokud je jako typ uveden text/xslmísto text/xml, který by tam měl správně být. FF zvládá obojí.
Realizace transformací • pomocí procesoru jazyka XSLT • samostatný program, která dovede aplikovat styly na základní XML dokument a provést jeho transformaci • XT, Saxon, Xalan, … • MSXML (zabudováno v editoru Cooktop) • příklad transformace pomocí procesoru XT java -cp xt.jar com.jclark.xsl.sax.Driver kurz.xml kurz.xsl kurz.html zdrojový XML dokument XSL styl název cílového dokumentu
Zdroje • Stránky konsorcia W3C (specifikace XSL, XSLT, XSL-FO, XPath) http://www.w3.org/Style/XSL/ • Specifikace XSLT verze 1.0 http://www.w3.org/TR/xslt • Jiří Kosek – XSLT v příkladech http://www.kosek.cz/xml/xslt/index.html • XSLT Tutorial (anglicky) http://www.w3schools.com/xsl/ • XSLT Tutorial (anglicky) http://www.zvon.org/xxl/XSLTutorial/Output/index.html • Procesor XT • oficiální stránky: http://www.blnz.com/xt • rozšířený o podporu českého kódování (autor Jiří Kosek): http://www.kosek.cz/xml/xt/ • Cooktop – freeware XML editor (vhodný i pro editaci XSL stylů) http://www.xmlcooktop.com/