XML a XSLT Kapitola seznamuje s šablonami XSLT a jejich použití při transformaci z XML do HTML Zdroje: M. ŽÁK: XML (začínáme programovat), Grada Publishing, 2005 I. MLÝNKOVÁ, M. NEČASKÝ, J. POKORNÝ, K. RICHTA, K. TOMAN, V. TOMAN: XML Technologie, Grada Publishing, a.s., Praha 2008 J. KOSEK: XML pro každého, Grada Publishing, 2010 Klíčové pojmy: XSLT, XPath, hrany, uzly. šablony, vestavěné šablony, instrukce, 1 Co to je XSLT XSLT = Extensible Stylesheet Language Transformations je spojen se styly, říká, jak data zobrazovat transformuje XML na HTML umožňuje data vybírat, upravovat, řadit, mít podmínky i cykly styly pomocí CSS souborů je aplikací XML do XML souboru přidáme hned za deklaraci odkaz na XSLT soubor, pomocí něhož chceme xml soubor zpracovávat: <?xml-stylesheet type="text/xsl" href="knihy.xsl"?> soubor XSLT (knihy.xsl) musí začínat stejně jako XML dokument: <xsl:stylesheet version="1.0" // obsah xmlns:xsl="http://www.w3.org/1999/xsl/transform"> </xsl:stylesheet> kořenovým elementem musí být stylesheet, xsl: deklaruje jmenný prostor 2 XPath XML soubor má stromovou strukturu s hranami a uzly XPath... jazyk pro pohyb ve stromové struktuře, vrací uzly odpovídající danému kritériu je 7 typů uzlů, uzlem je: kořenový uzel 2012-07-25 XML a XSLT 1/9
elementy atributy komentáře jmenné prostory, instrukce pro zpracování, text (i "bílá místa, znaky": mezery, konec řádku, posun řádku, tabulátor) zástupné znaky: / kořenový uzel (celý dokument XML = instrukce zpracování, komentář, kořenový element) * uzel typu element. aktuální uzel 3 Šablony <xsl:template> potomek elementu: xml-stylesheet určují výsledek celé transformace šablony odpovídají určitému uzlu nebo skupině uzlů zdrojového dokumentu šablona říká prohlížeči, jak zobrazit XML pomocí instrukcí pro transformaci komponent XML atributy šablony: match... jméno elementu, na nějž se aplikují příkazy uvnitř šablony name... uchovává jméno šablony pro další použití priority... určuje pořadí, když lze použít více šablon mode... pro skupinu uzlů a instrukci <xsl:apply-templates> budou použity jen šablony se stejnou hodnotou mode struktura šablony: <xsl:template match="lokace"> // tělo šablony v těle šablon mohou být: data typu PCDATA rozšiřovací elementy - definovány uživatelem nebo procesorem XCLT doslovné elementy - není ani instrukcí XSL ani rozšiřovacím elementem, kopírují se bez jakékoliv změny instrukce XSLT <xsl:apply-imports> <xsl:apply-templates> <xsl:attribute> <xsl:call-templates> <xsl:choose> <xsl:comment> <xsl:copy> <xsl:copy-of> <xsl:element> <xsl:fallback> 2012-07-25 XML a XSLT 2/9
<xsl:for-each> <xsl:if> <xsl:message> <xsl:number> <xsl:processing-instruction> <xsl:text> <xsl:value-of> <xsl:variable> 3.1 Instrukce <xsl:apply-templates/> umožňuje rekurzivní aplikování šablony, hledá rekurzivně další vnořené šablony a vypíše jejich obsah nepovinný atribut select... označuje jméno uzlu, který má být zpracován, jinak jsou zpracovány všechny následující uzly <xsl:apply-templates select="prvek"/> Příklad knihy.xml <?xml-stylesheet type="text/xsl" href="knihy.xsl"?> <seznam> <kniha> <nazev>povídky z jedné kapsy</nazev> <autor>karel Čapek</autor> <nakladatelstvi>melantrich</nakladatelstvi> <naklad jednotka="tis.">100</naklad> <rok zeme="(cz)">1968</rok> </kniha> <kniha> <nazev>světová revoluce</nazev> <autor>tomáš G. Masaryk</autor> <nakladatelstvi>orbis</nakladatelstvi> <naklad jednotka="tis.">50</naklad> <rok zeme="(cz)">1925</rok> </kniha> <kniha> <nazev>the Feynman lectures on physics</nazev> <autor>richard Feynman</autor> <nakladatelstvi>addison-wesley publishing Company</nakladatelstvi> <naklad jednotka="tis.">20</naklad> <rok zeme="(usa)">1966</rok> </kniha> <kniha> <nazev>java pro zelenáče</nazev> <autor>miroslav Virius</autor> <nakladatelstvi>neocortex</nakladatelstvi> <naklad jednotka="tis.">10</naklad> <rok zeme="(cz)">2005</rok> </kniha> </seznam> 2012-07-25 XML a XSLT 3/9
knihy.xsl <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <head></head> <body> <xsl:apply-templates/> </body> </html> </xsl:stylesheet> Prohlížeč začíná aplikovat šablonu (rekurzivně) na kořenový uzel XML (nebo nějaký další uzel): 1. hledá šablonu definující styl, který odpovídá uzlu 2. pokud najde odpovídající šablonu, vykoná instrukce obsažené v šabloně (spustí transformaci uzlu šablony) 3. pokud nenajde, použije vhodnou vestavěnou šablonu = šablona definovaná specifikací XSLT 3.2 Vestavěná šablona pro kořenový uzel XSLT aplikuje šablonu pro všechny potomky kořenového uzlu (pro každý uzel potomka provede kroky 1. -3.) pro uzel element aplikuje šablonu pro všechny potomky uzlu (pro každý uzel potomka provede kroky 1. -3.) pro uzel text zobrazí text, pro uzel atribut zobrazí hodnotu atributu, atribut není potomkem uzlu element pro uzel komentáře neudělá nic Pro náš případ se začne aplikovat šablona pro kořenová uzel, hledá šablony pro potomky uzlů a pak zase pro jejich potomky, nic nenajde, až dojde k textu, ten vypíše: Povídky z jedné kapsykarel ČapekMelantrich1001968Světová revolucetomáš G. MasarykOrbis501925The Feynman lectures on physicsrichard FeynmanAddison-Wesley publishing Company201966Java pro zelenáčemiroslav ViriusNeocortex102005 3.3 Instrukce <xsl:value-of select="prvek"/> text obsažený v daném uzlu vloží na výstup HTML, ten text zobrazí zobrazí i znaková data potomků knihy.xsl <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/seznam"> <html> <xsl:apply-templates/> </html> 2012-07-25 XML a XSLT 4/9
<p> <xsl:value-of select="autor"/> <xsl:value-of select="nazev"/> </p> </xsl:stylesheet> 1. pro uzel <seznam> začne aplikovat šablonu, hledá šablony pro uzly potomků 2. najde šablonu pro uzel-element <kniha> 3. šablona říká, že se má do odstavce vypsat text elementů <autor> a <název > zobrazení v prohlížeči: Karel ČapekPovídky z jedné kapsy Tomáš G. MasarykSvětová revoluce Richard FeynmanThe Feynman lectures on physics Miroslav ViriusJava pro zelenáče 3.4 Mohu se také pokusit o zobrazení dat v tabulce: <xsl:template match="/seznam"> <html> <head> <title>seznam knih</title> </head> <body> <h1>seznam knih</h1> <table border="1"> <tr> <th>název</th> <th>autor</th> <th>nakladatelství</th> <th>náklad</th> <th>rok</th> </tr> <xsl:apply-templates/> </table> </body> </html> <tr> <td><xsl:value-of select="nazev"/></td> <td><xsl:value-of select="autor"/></td> <td><xsl:value-of select="nakladatelstvi"/></td> <td><xsl:value-of select="naklad"/></td> <td><xsl:value-of select="rok"/></td> </tr> 2012-07-25 XML a XSLT 5/9
Seznam knih Název Autor Nakladatelství Náklad Rok Povídky z jedné kapsy Karel Čapek Melantrich 100 1968 Světová revoluce Tomáš G. Masaryk Orbis 50 1925 The Feynman lectures on physics Richard Feynman Addison-Wesley publishing Company 20 1966 Java pro zelenáče Miroslav Virius Neocortex 10 2005 3.5 Pokud budeme chtít vypsat i hodnoty atributů, můžeme použít instrukci: <xsl:apply-templates select="element"/> Vytvoříme pak pro dané elementy vlastní šablony: <xsl:template match="element"> <xsl:value-of select="."/> <xsl:text> </xsl:text> <xsl:value-of select="@jednotka"/> // šablona pro element // data aktuálního uzlu // zobrazení mezery // výpis hodnoty atributu se jménem jednotka clanek.xsl- doplnění: <tr> <td><xsl:value-of select="nazev"/></td> <td><xsl:value-of select="autor"/></td> <td><xsl:value-of select="nakladatelstvi"/></td> <td><xsl:apply-templates select="naklad"/></td> <td><xsl:apply-templates select="rok"/></td> </tr> <xsl:template match="naklad"> <xsl:value-of select="."/> <xsl:text> </xsl:text> <xsl:value-of select="@jednotka"/> <xsl:template match="rok"> <xsl:value-of select="."/> <xsl:text> </xsl:text> <xsl:value-of select="@zeme"/> u elementů nazev, autor a nakladatelstvi budeme uz jenom vypisovat obsah, proto použijeme instrukci <xsl:value-of select="nazev"/> u elementů naklad a rok chceme vypsat i hodnotu atributu, proto užijeme instrukci <xsl:apply-templates select="rok"/> a napíšeme pro ně vlastní šablonu Název Autor Nakladatelství Náklad Rok Povídky z jedné kapsy Karel Čapek Melantrich 100 tis. 1968 (CZ) Světová revoluce Tomáš G. Masaryk Orbis 50 tis. 1925 (CZ) The Feynman lectures on physics Richard Feynman Addison-Wesley publishing 20 tis. Company 1966 (USA) Java pro zelenáče Miroslav Virius Neocortex 10 tis. 2005 (CZ) 2012-07-25 XML a XSLT 6/9
3.6 Instrukce <xsl:text> s její pomocí můžeme vložit text 3.7 Instrukce <xsl:for-each> s její pomocí můžeme cyklicky procházet tělo šablony: <xsl:for-each select="kniha"> <p> <xsl:value-of select="nazev"/> </p> </xsl:for-each> 3.8 Instrukce <xsl:copy-of> kopírování ze zdrojového uzlu do výstupního stromu kopie obsahuje i atributy a potomky vhodné pro kopii z jednoho XML do druhého <xsl:template match="/"> <xsl:copy> <xsl:copy-of select="*"/> </xsl:copy> 3.8 Instrukce <xsl:if> podobně jako v programovacích jazycích <xsl:if test="naklad>10"> <p><xsl:value-of select="nazev"/></p> </xsl:if> 3.9 Predikáty = výsledek posouzení můžeme zjistit hodnotu elementu, atributu, zjistit potomky elementu,... pro manipulaci s uzly slouží funkce: last()... vrací pořadové číslo posledního uzlu position()... vrací pozici kontextového uzlu count(sada-uzlů)... vrací počet uzlů id(řetězec ID)... vrací sadu uzlů name(sada-uzlů)... vrací sadu uzlů Příklad: Pomocí position() můžeme vytvořit výčet elementů kniha číslovaný seznam: <p> <xsl:value-of select="position()"/> <xsl:text>. </xsl:text> <xsl:value-of select="nazev"/> </p> 2012-07-25 XML a XSLT 7/9
3.10 Jedna xml data tak mohu zobrazit vícekrát: <xsl:template match="/seznam"> <html> <head> <title>seznam knih</title> </head> <body> <h3>číslovaný seznam knih</h3> <xsl:for-each select="kniha"> <p> <xsl:value-of select="position()"/> <xsl:text>. </xsl:text> <xsl:value-of select="nazev"/> </p> </xsl:for-each> <h3>knihy s větším počtem výtisků</h3> <ul><xsl:apply-templates/></ul> </body> </html> <xsl:if test="naklad>10"> <li><xsl:value-of select="nazev"/></li> </xsl:if> <xsl:template match="kniha[autor!='karel Čapek']"> <li><xsl:value-of select="nazev"/></li> </xsl:stylesheet> 3.11 Seznam jako odkaz na záložku vytvoření atributu: Vložení odkazu na záložku - v kódu to vypadá takto: <a href="#jmeno_zalozky">text odkazu</a> Příklad: <xsl:for-each select="kapitola"> <a> <xsl:attribute name="href">#o <xsl:value-of select="position()"/> </xsl:attribute> <xsl:value-of select="position()"/><xsl:text>. </xsl:text> <xsl:value-of select="nadpis2"/> </a> </xsl:for-each> Záložka pak může vypadat třeba takto: <a name="jmeno_zalozky"></a> <h2 id="jmeno_zalozky">nadpis</h2> <span id=" jmeno_zalozky ">nějaká ukázka</span> Příklad: <h2> <xsl:attribute name="id">o<xsl:value-of select="position()"/> </xsl:attribute> <xsl:value-of select="position()"/><xsl:text>. </xsl:text> <xsl:value-of select="nadpis"/> </h2> 2012-07-25 XML a XSLT 8/9
4 Shrnutí přehled šablon a instrukcí 4.1 Kořenový element souboru XSLT <xsl:stylesheet>... </xsl:stylesheet> id... (nepovinný) version... (povinný)... obvykle "1.0" xmlns... xmlns:xsl="http://www.w3.org/1999/xsl/transform"... určení jmenného prostoru 4.2 Šablona XSL pro určitý uzel nebo skupinu uzlů <xsl:template>... match... (nepovinný)..."lokace" uzlu name... (nepovinný)... uchovává název šablony pro další její volání priority... (nepovinný)... číslo určující pořadí šablony mode... (nepovinný Pokud není element v těle šablony instrukcí nebo rozšiřovacím elementem, bude doslovně zkopírován do výsledku 4.3 Těla šablon instrukce XSLT <xsl:apply-templates /> vyhledá patřičný uzel a nahradí ho obsahem šablony select... (nepovinný)... označuje jméno uzlu, který má být zpracován, jinak jsou zpracovány všechny následující uzly hledá rekurzivně další vnořené šablony, když je nenajde, vypíše pouze obsah elem. <xsl:value-of /> text obsažený v daném uzlu vloží na výstup HTML, ten text zobrazí select... (nepovinný)... označuje jméno uzlu, který má být zpracován <xsl:text>... </xsl:text> vkládání doslovného textu <xsl:attribute>... </xsl:attribute> vytvoření atributu name... (povinný)... jméno atributu <xsl:for-each>... </xsl:for-each> select... (nepovinný)... označuje jméno uzlu, který má být zpracován 2012-07-25 XML a XSLT 9/9