Kapitola 1. Transformace (XSLT podrobně, STX) Obsah Jazyk XSLT...............................................................................................................2 Souvislosti, historie .............................................................................................2 Hlavní principy...................................................................................................2 Hlavní principy (2) ..............................................................................................3 Hlavní informační zdroje - specifikace, reference, tutoriály, FAQ .................................3 Syntaxe XSLT............................................................................................................3 Struktura celého XSLT stylu .................................................................................3 Struktura celého XSLT stylu (2).............................................................................4 XSLT šablony ....................................................................................................4 Sémantika XSLT ........................................................................................................4 XSLT - postup zpracování vstupního dokumentu ......................................................4 XSLT - pořadí volání šablon .................................................................................4 XSLT - specifikace výstupu/"výsledku" šablony .......................................................5 XSLT - výstup textových uzlů ...............................................................................5 Implicitní šablony ...............................................................................................5 Přehled implicitních šablon...................................................................................6 Přehled implicitních šablon (2) ..............................................................................6 Vybrané XSLT konstrukce podrobněji ............................................................................6 Generování pevně daného elementu s atributy...........................................................6 Generování elementu s kalkulovaným názvem i atributy .............................................7 Řízení chodu transformace uvnitř šablony - větvení ...................................................7 Řízení chodu transformace uvnitř šablony - vícecestné větvení.....................................8 Řízení chodu transformace uvnitř šablony - cykly......................................................8 Procesory XSLT (XSLT Transformation Engines).....................................................9 Pokročilá témata .........................................................................................................9 Režimy (módy) zpracování ...................................................................................9 Deklarace a volání pojmenovaných šablon.............................................................10 Automatické (generované) číslování .....................................................................10 Automatické číslování (2) ...................................................................................11 Co používat raději?............................................................................................13 Znovupoužitelnost stylů .....................................................................................13 Návrhové vzory ................................................................................................13 Odkazy na pokročilá témata ................................................................................14 Motivace a hlavní principy..........................................................................................14 Co jsou STX?...................................................................................................14 Proudové zpracování na bázi SAX........................................................................14 Proudové zpracování na bázi SAX - příklad řetězce filtrů..........................................14 Proudové zpracování na bázi SAX (2) ...................................................................14 1 Transformace (XSLT podrobně, STX) Vztah STX a SAX.............................................................................................15 Hlavní charakteristiky proudových transformací......................................................15 Zpracování STX .......................................................................................................15 Model zpracování..............................................................................................15 Co je při zpracování dokumentu k dispozici ...........................................................16 Není to omezující? ............................................................................................16 STX styl a zpracování - příklad............................................................................16 Jak transformaci spouštět z Javy...........................................................................16 Jazyk stylů STX........................................................................................................17 ....................................................................................................................... 17 Zdroje.....................................................................................................................17 STX procesor(y) ...............................................................................................17 Informace, dokumentace.....................................................................................17 Jazyk XSLT Souvislosti, historie • XSLT (extensible Stylesheet Language Transformation) [http://w3.org/style/XSL] je jazyk pro specifikaci transformací XML dokumentů na (obvykle) XML výstupy, případně textové, HTML či jiné výstupní formáty. • Původní aplikační oblastí byla transformace XML dat na XSL:FO (formátovací objekty), tedy vizua-lizaceXML. • XSLT byl tedy součástí specifikací XSL [http://w3.org/style/XSL] (extensible Stylesheet Language). • Později se z XSL vyčlenil a začal být chápán jako univerzální jazyk popisu obecných XML->XML(txt, HTML) transformací. • Aktuální verze je dána specifikací XSLT 1.0 [http://www.w3.org/TR/xslt]. Práce na verzi 1.1 byly zastaveny ve prospěch vývoje XSLT 2.0 [http://www.w3.org/TR/xslt20]. Hlavní principy • XSLT je funkcionálním jazykem, kde redukční pravidla mají podobu šablon, které předepisují, jak se uzly zdrojového dokumentu přepisují do výstupního dokumentu. Specifikace XSLT transformace je obsažena v tzv. stylu (stylesheet), což je XML dokument tvořený podle syntaxe XSLT. Kořenovým elementem j e stylesheet nebo transformation (to jsou synonyma). • XSLT styl obsahuje tzv. šablony (template). 2 Transformace (XSLT podrobně, STX) Hlavní principy (2) Šablony mají výběrovou část - která reprezentuje levou stranu funkcionálního redukčního pravidla a konstrukční část představující pravou stranu red. prav. • Výběrovou část tvoří atribut match šablony. Konstrukční část představuje tělo elementu šablony. Vlastní transformace pak znamená, že interpreter XSLT stylů {XSLTprocesor, XSLT engine) bere uzly vstupního dokumentu, vyhledá k nim vhodnou šablonu - podle její výběrové části - a vyprodukuje výsledek odpovídající konstrukční části pravidla daného touto šablonou. Hlavní informační zdroje - specifikace, reference, tutoriály, FAQ • XSLT 1.0 W3C Recommendation: http://www.w3.org/TR/xslt • What is XSLT? na XML.COM: http://www.xml.eom/pub/a/2000/08/holman/index.html • Mulberrytech.com XSLT Quick Reference (2xA4, PDF): http://www.mulberrytech.com/quickref/XSLTquickref.pdf • Dr. Pawson XSLT FAQ: http://www.dpawson.co.uk/xsl/xslfaq.html • Zvon XSLT Tutorial: http://zvon.org/xxl/XSLTutorial/Books/Bookl/index.html Syntaxe XSLT Struktura celého XSLT stylu Kořenový element xsktransform nebo xskstylesheet uzavírá celý XSLT styl a specifikuje NS prefix pro XSLT elementy. V kořenovém elementu je: Deklarace parametrů (a jejich implic. hodnoty) - elt. xskparam . Parametry lze nastavit při volání XSLT procesoru - např. java netsf.saxon.Transform -o outfile.xml infile.xml style.xsl -Dparam=paramvalue Deklarace a inicializace proměnných - elt. xskvariable - proměnné jsou de facto totéž, co parametry, ale nejsou nastavitelné zvenčí. Je třeba si uvědomit, že XSLT (bez procesorově-specifických rozšíření) je čistý funkcionální jazyk, tj. aplikace šablony nemá vedlejší efekt -> proměnné lze přiřadit jednou, pak už jen číst! 3 Transformace (XSLT podrobně, STX) Struktura celého XSLT stylu (2) V kořenovém elementu je dále: • Deklarace (formátu) výstupu - elt. xskoutput ...kromě toho tam mohou být další, méně používané XSL elementy - viz např. dokumentace SAXO-Nu [http://saxon.sf.net] • pak následují vlastní šablony - elt. xsktemplate XSLT šablony Šablona (template) je specifikace který uzel přepsat a na co (jak). Který uzel se přepisuje, je dáno atributem match . Na co se přepisuje, je uvedeno v těle šablony. Šablona může být explicitně pojmenovaná (named template), v tom případě ji lze volat přímo/explicitně pomocí xslxall-template . Sémantika XSLT XSLT - postup zpracování vstupního dokumentu • Nejdříve se za aktuální uzel zvolí kořen, tj. uzel odpovídající XPath výrazu / Najde se šablona (explicitní nebo implicitní - viz např. XSLT/XPath Quick Reference [http://www.mulberrytech.com/quickref/XSLTquickreipdfJ), jejíž match atribut chápaný jako XPath predikát vrátí v kontextu aktuálního uzlu true (tedy tzn. "matchuje" aktuální uzel). Pokudje jich více - nastává nejednoznačnost - pak je indikována chyba. • Pokudje taková šablona právě jedna, aplikuje se, což znamenápřenesení jejího obsahu do výstupního result tree fragmentu. XSLT - pořadí volání šablon Je možné je specifikovat: 1. Přímo/explicitně voláním (pojmenované) šablony - což ale odpovídá spíše přístupu procedurálních jazyků, takže se tomu spíše vyhýbáme. 4 Transformace (XSLT podrobně, STX) 2. Nepřímo/implicitně tím, že se zavolá šablona, jejíž vzor (obsah atr. match ) "pasuje" ("matchuje") na vybraný uzel - funkcionální přístup. Výběr uzlu se přitom děje opět: • Explicitně ("řízené") uvedením atributu select u apply-templates . Takto můžeme vybrat jak dceřinné elementy, tak dceřinné uzly, tak jakékoli jiné uzly odpovídající XPath výrazu uvedenému v select. • Implicitně, necháme-li procesor sám "si uzel vybrat" (u apply-templates neuvádíme select). V tomto případě se ale vybírají pouze dceřinné elementy kontextového uzlu. XSLT - specifikace výstupu/'Výsledku" šablony Výstupem aplikace šablony je část tzv. result tree fragmentu. • Výstupy jednotlivých šablon se "skládají" na to místo result tree fragmentu, který odpovídá pořadí volání šablon. • Výstup celé transformace pak směřuje standardně do jednoho proudu, kde se z výstupního proudu událostí generuje výsledný (XML, text, HTML) dokument. • Výstup bývá procesorem primárně generován jako sled událostí (např. SAX2), které jsou až druhotně převáděny na výsledný dokument - s uplatněním výstupního kódování, atd. XSLT - výstup textových uzlů Jak dostat text (textový uzel) na výstup? 1. Vepsat text přímo (jako literal) do výstupu (konstrukční části) šablony. Pozor na bílé znaky (mezery, CR/LF)! 2. vepsat text přímo (jako literal) do výstupu šablony. Pozor na bílé znaky (mezery, CR/LF)! 3. do speciálního elt. textový uzel . Bílé znaky jsou v něm vždy zachovány/respektovány! Implicitní šablony Implicitní šablony jsou "vestavěné" v každém korektním procesoru XSLT: • aby byly (alespoň jistým standardním "fallback" způsobem) zpracovány základní struktury (procházení stromu dokumentu) • abychom "ušetřili psaní" často používaných šablon (ignorování komentářů a Pí). Jsou překrytelné, abychom mohli chování změnit uvedením vlastní šablony, která bude mít stejnou 5 Transformace (XSLT podrobně, STX) (nebo překrývající se) klauzuli match= . Přehled implicitních šablon "Default tree (do-nothing) traversal": "Default tree (do-nothing) traversal for specified mode": Přehled implicitních šablon (2) "Copy text nodes and attributes" (do výsledku zkopíruje textové uzly a atributy): "Ignore Pis and comments" ignoruje (nezahrnuje do výsledku PI a komentáře): Vybrané XSLT konstrukce podrobněji Generování pevně daného elementu s atributy Cíl: Vygenerovat na výstup předem daný element (s předem znamýmjmenem), ale s atributy s hodnotami kalkulovanými při transformaci. Řešení: Použít normální postup - literal result element - a hodnoty atributy specifikovat jako tzv. attribute value templates (A VT): 6 Transformace (XSLT podrobně, STX) Vstup: Šablona: ... Transformuje odkaz link na a , hodnotu atributu href spočte tak, že před hodnotu původního atributu ref přidá znak # Generování elementu s kalkulovaným názvem i atributy Cíl: Vygenerovat na výstup element, jehož název, atributy i obsah předem - při psaní stylu - neznáme. Řešení: Použít do konstrukční části šablony xskelement: Vstup: ... Šablona: IDl Vytvoří element s názvem eltname , opatří jej atributem id-TDl" . Řízení chodu transformace uvnitř šablony - větvení Cíl: Větvit generování výstupu na základě podmínky. Řešení: Použít do konstrukční části šablony větvení - jednoduché xsl:if nebo vícecestné xslxhoose / xsl:when/xsl:otherwise : Vstup: ... Šablona: 7 Transformace (XSLT podrobně, STX)

Drahý rohlik - cena

Vytvoří element p , do něj vloží info o rohlíku - se zvýrazněním, je-li drahý. Řízení chodu transformace uvnitř šablony - vícecestné větvení Vstup: ... ... ... Šablona:

Drahý Podezřele levný Běžný rohlik - cena

Odfiltruje dvě extrémní úrovně ceny - pro xskotherwise zůstane „normální" cena. Řízení chodu transformace uvnitř šablony - cykly Cíl: Větvit generování výstupu na základě podmínky. Řešení: Použít do konstrukční části šablony větvení - jednoduché xsl:if nebo vícecestné xslxhoose / xsl:when/xsl:otherwise : Vstup: . . . 8 Transformace (XSLT podrobně, STX) ... ... Šablona:

Rohlik - cena

Vytvoří element p , do něj vloží info o rohlíku - se zvýrazněním, je-li drahý. Pozor: Konstrukce xsl:for-each má typicky procedurální charakter, je dobré s ní šetřit. Dává totiž minu-mum flexibility na obsah iterované množiny uzlů - tj. předem musím vědět, co tam bude. Procesory XSLT (XSLT Transformation Engines) Populárními volně dostupnými procesory XSLT v javovém prostředí jsou: • S AXON (autor M.H.Kay) [http://saxon. sf.net] • XALAN (autor Apache Software Foundation) [http://xml.apache.org/xalan-j/index.html] další free i komerční procesory k nalezení na XML Software [http://www.xmlsoftware.com/xslt.html] Pokročilá témata Režimy (módy) zpracování Motivace: Módy umožňují mít paralelně sadu šablon se stejnými vzory match, používaných ale pro různé účely, např.: • jedna sada pro generování obsahu (index) dokumentu • drahá pro formátování plného textu dokumentu Při explicitním vyvolání aplikace šablon (apply-templates ) lze uvést mód (atributem mode= ): • uvede-li se, aplikují se pouze šablony se stejným módem, jaký byl uveden v xskapply-templates mo-de="mód" . 9 Transformace (XSLT podrobně, STX) • neuvede-li se, aplikují se pouze šablony bez specifikace módu (bez atributu mode= ). Deklarace a volání pojmenovaných šablon Deklarace - xsktemplate name="jmeno_sablony" Šablona smí obsahovat deklarace parametrů: • Volání - volání smí specifikovat parametry: • nebo • hodnota parametru Automatické (generované) číslování Vložíme-li do konstrukční části šablony (do těla šablony) element xsknumber, zajistí nám vygenerování čísla daného čítačem. Je možné uvést, podle čeho se má číslovat, např.: • pořadového čísla zdrojového elementu v rámci jeho rodičovského elementu - a to i víceúrovňově, např. číslo kapitoly 1.1. apod. Příklad 1.1. Automatické číslování podle pozice elementu Aplikujeme-li tento styl
10 Transformace (XSLT podrobně, STX)
na následující zdrojový soubor Bugs Bunny 03/21/197 0 31
4895 Wabbit Hole Road
8 65-lll-llll
Daisy Duck 08/09/194 9 51
748 Golden Pond
8 65-222-2222
Minnie Mouse 04/13/197 7 2 4
4064 Cheese Factory Blvd
8 65-333-3333
dostaneme výslednou HTML stránku (nebrat v úvahu odsazení - to bude jiné...) l. Bugs Bunny
2. Daisy Duck
3. Minnie Mouse
Automatické číslování (2) Příklad 1.2. Automatické víceúrovňové číslování 11 Transformace (XSLT podrobně, STX) Aplikujeme-li tento styl

na následující zdrojový soubor Moje nová kniha Prvni kapitola Prvni sekce prvni kapitoly Text Druhá sekce prvni kapitoly Text druhé sekce Druhá kapitola Prvni sekce druhé kapitoly Text 12 Transformace (XSLT podrobně, STX) Druhá sekce druhé kapitoly Text druhé sekce dostaneme výslednou HTML stránku Co používat raději? • Preferovat funkcionální přístup - např. xsktemplate match= a xskapply-templates select= • před procedurálním přístupem - xsktemplate name= a xslxall-template name= Používat módy zpracování ( xsktemplate ... mode= a xskapply-templates ... mode= ) módy lze dobře kombinovat s funkcionálním přístupem: • xskapply-templates select=... mode=... • xsktemplate match=... mode=... Znovupoužitelnost stylů Co pro ni můžeme udělat? Členit styly do menších znovupoužitelných celků (souborů) a podle potřeby je vřazovat pomocí xskinclude a nebo, ještě lépe, xskimport - protože import upřednostňuje šablony uvedené přímo v základním stylu nad šablonami importovanými. Podrobněji viz příspěvek TP pro DATAKON 2001 - fulltext příspěvku [http://www.fi.muni.cz/~tomp/xml03/pitner.docj a siidy [http://www.fi.muni.cz/~tomp/xml03/prezentace.pptj. Návrhové vzory Identická transformace 1 (neprevede do výsledku atributy kořenového elementu!) http://wwbota.free.fr/XSLT_models/identquery.xslt Identická transformace 2 http://wwbota.free.fr/XSLT_models/identquery2.xslt Identická transformace s potlačením elementů, které nemají na ose // (v dceřinných uzlech ani jejich potomcích) žádné textové uzly http://wwbota.free.fr/XSLT_models/suppressEmptyElements.xslt 13 Transformace (XSLT podrobně, STX) Nahradí atributy pomocí elementů http://wwbota.free.fr/XSLT_models/attributes2elements.xslt Dtto, ale elementy vzniklé z atributů jsou ve zvláštním jmenném prostoru xsh7attributes2elements.xslt [http://www.fi.muni.cz/~tomp/xml03/xslt/attributes2elements.xslt] Reverzní transformace xsh7elements2attributes.xslt [http://www.fi.muni.cz/~tomp/xml03/xslt/elements2attributes.xslt] Odkazy na pokročilá témata XSLT Design Patterns - výběr [http://www.dpawson.co.uk/xsl/sectl/N169.html] The Functional Programming Language XSLT [http://www.topxml.eom/xsl/articles/fp/l.asp] Motivace a hlavní principy Co jsou STX? Proudové transformace pro XML (Streaming Transformations for XML [http://stx.sf.net], STX) jsou alternativním mechanizmem, jak specifikovat i prakticky vykonávat netriviální transformace XML zdrojů na XML a dalších formátů. STX nabízejí transformační postup založený na jednoprůchodovém, tedy proudovém (=streaming), zpracování XML vstupu bez nutnosti budovat stromovou podobu zdrojového dokumentu, což: snižuje paměťové nároky a umožňuje zpracovat širší škálu (velkých) zdrojových dokumentů/dat; • je potenciálně rychlejší (ve stávajících implementacích zatím bohužel ne - chybí optimalizace) Proudové zpracování na bázi SAX SAX (Simple API for XML Processing [http://saxproject.org]) určuje proudové rozhraní pro zpracování XML; • proudové transformace XML bychom tedy mohli psát jako tzv. SAX filtry - • tento postup je ale programátorsky náročný a nepohodlný: • je to hodně nízkoúrovňová záležitost, • ve filtruje třeba explicitně udržovat stav zpracování, • vytvářet pomocné datové struktury... atd. Proudové zpracování na bázi SAX - příklad řetězce filtrů 14 Transformace (XSLT podrobně, STX) Proudové zpracování na bázi SAX (2) • udržovatelnost a rozšiřitelnost netriviálních filtruje obtížná, proto • vznikaly různé "berličky" jako Programmable SAX Filter [http://raritantechnologies.com/sax.shtml] (open-source, Raritan Technologies); • všechny měly společný imperativní přístup ke specifikaci transformace. STX nabízí možnost popsat transformace deklarativně, podobně jako v jazyce XSLT, na nějž jsou programátoři již zvyklí, • STX se také nazývá " SAX se syntaxí XSLT". Vztah STX a SAX STX popisují proudové transformace, SAX (Simple API for XML Processing [http://saxproject.org]) určuje proudové rozhraní. STX jsou budovány jako nadstavba SAX a mohou být se SAX kombinovány, • programovat (psát transformační styly) pro STX je méně náročné než programovat SAX (transformační) filtry. Hlavní charakteristiky proudových transformací Dobrým podrobnějším zdrojem info je http://www.informatik.hu-berlin.de/~obecker/Docs/EML2003/. [http://www.informatik.hu-berlin.de/~obecker/Docs/EML2003/] Zpracování STX Model zpracování Charakteristika STX transformačního stylu a zpracování je podobná XSLT: styl je XML dokument obsahující šablony podobné jako XSLT šablony j sou voleny a aplikovány podle vzorů v klauzulích match • v šablonách mohou být buďto: "literal result elements", čili přímo napsaný text, elementy mimo jmenný prostor XSLT... nebo • instrukce XSLT 15 Transformace (XSLT podrobně, STX) • namísto XPath jako pro XSLT je u STX používán jazyk STXPath. při zpracování dokumentu k dispozici Pří zpracování vstupního dokumentu šablonami máme k dispozici u XSLT strom celého dokumentu a u STX jen zásobník předchůdců. Lze tedy přistupovat u XSLT k libovolnému uzlu vstupního dokumentu a u STX jen k aktuálnímu uzlu a jeho předchůdcům. Není to omezující? STX styl a zpracování - pnklad Příklad převzat z Extended SAX Filter Processing with STX by Oliver Becker [http://www.iirfonnatik.hu-berlin.de/~obecker/Docs/EIVIL2003/script.html] „Modify the input by adding a consecutive ID attribute to certain elements (footnotes that appear within chapters):" Jak transformaci spouštět z Javy STX podporuje rozhraní JAXP, čili STX procesor lze nastavit jako transformační nástroj v JAXP a ná- 16 Transformace (XSLT podrobně, STX) sledně místo XSLT stylů používat STX styly: // use Joost as transformation engine System.setProperty("j avax.xml.transform.Trans formerFactory", "net.sf.joost.trax.Trans formerFactorylmpl") ; // the remaining code is known area TransformerFactory tFactory = TransformerFactory.newlnstance(); SAXTransformerFactory saxTFactory = (SAXTransformerFactory) tFactory; // of course the transformation source must be different TransformerHandler tHandlerl = saxTFactory.newTransformerHandler(new StreamSource("trans.stx") ) ; myReader.setContentHandler(tHandlerl); myReader.setProperty("http://xml.org/sax/properties/lexical-handler", tHandlerl); tHandlerl.setResult(new SAXResult(tHandler2)); Jazyk stylů STX Zdroje STX procesor(y) Vzhledem k novosti standardu je počet implementujících procesorů dosud malý. K dispozici j sou: Joost open-source javová implementace dostupná na http://stx.sourceforge.net/ XML:: STX open-source implementace pro čistý Perl dostupná na http://www.gingerall.org/charlie/ga/xml/p_stx.xml Informace, dokumentace Odkaz na většinu publikovaných článků i disertaci O. Beckera je na http://stx.sourceforge.net/. 17