XSL - extensible stylesheet language XSL kehitettiin xml aineistojen esitysmuodon määrittelyyn (T ~ Transformations) dokumentin rakenteen tai sisällön muunnokset 1.0 (http://www.w3.org/tr/xslt) 1999 2.0 (http://www.w3.org/tr/xslt20/) 2007 XSL ( :n lisäksi XSL-FO = Formating objects) ladonta ja muotoilu XSL 1.1 (http://www.w3.org/tr/xsl/) (2006) Yhden tai useamman XML-lähdedokumentin muuntaminen yhdeksi tai useammaksi tulosdokumentiksi Tulosdokumentti voi olla XML-rakenteinen, mutta myös muuta muotoa esim. HTML, RTF, jne Tyypillisiä tulosmuotoja (XML tai XHTML) + CSS XLS-FO (joka edelleen tuottaa vaikka pdf-muodon) 1 2 Muunnos: puunjalostusta lähtöpuusta tulospuuhun Muunnossääntöjen liittäminen XML-materiaaliin hoidetaan materiaaliin liitetyllä käsittelyohjeella <?xml-stylesheet type="text/xsl" href= jokuxsl.xsl"?> Muunnossääntöjä sisältävä resurssi 3 4 on rakenteeltaan XML-kieli juurielementtinä stylesheet <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0">... Monet selaimet ja XML prosessorit kelpuuttavat 2.0 versionkin 5 XSL:n perustana ovat muunnossäännöt (templateelementti) Attribuutilla match: määritellään kohde, johon muunnossääntöä sovelletaan name: annetaan säännölle nimi. Nimeä käytetään aktivoitaessa sääntö nimellä. Silloin ei tarvita match attribuuttia. mode: nimeää ympäristön, jossa sääntöä sovelletaan. Valinnainen, käyttöä esim. tilanteissa, joissa on useita säännöstöjä valittavana priority:konfliktoivien sääntöjen valinnassa käytettävä painoarvo, valinnainen Elementin sisältönä kuvataan muunnos ja eteneminen puurakenteessa. 6 1
Sääntöjen kohteena olevat solmut määritellään rajoitetuilla XPath-valintalausekkeilla Kohdejoukko voi olla usean valintalausekkeen tulosten yhdistelmä match="h1 h2 h3 h4 h5" kaikki tasojen 1-5 otsakesolmut, jos lähtödokumentti on XHTML Valintalausekkeessa voidaan edetä elementtisolmuissa vain alaspäin puussa. Attribuuttisolmuihin viittaaminen on myös sallittua Sääntöä voidaan soveltaa solmuun, jos solmu on saavutettavissa valintalausekkeessa annetun polun kautta jostain lähtösolmusta 7 Muunnoksessa XML-rakenteen läpikäynnille on määritelty muutama oletussääntö: <xsl:template match="/ * "> <xsl:apply-templates /> Käsittele lapsisolmut Eli puu käydään läpi esijärjestyksessä ja kullekin solmulle sovelletaan siihen liittyvää muunnossääntöä Tässä on kuitenkin huomattava, että solmuun liittyvä sääntö voi katkaista etenemisen puussa alaspäin 8 Toinen oletussääntö <xsl:template match="text() @*"> <xsl:value-of select="."/> solmu itse märittelee, että tekstisolmun sisältö ja attribuutin arvo viedään tulosdokumenttiin. On kuitenkin syytä huomata, että edellisen sivun oletussäännön avulla ei päästä attribuuttisolmuihin. Oletusarvoisesti siis: alkuperäisen XML-puun tekstisolmujen sisällöt viedään esijärjestyksessä yhdeksi tekstipötköksi tulosdokumenttiin. Säännöillä on prioriteetti, jonka perusteella sovellettavan säännön valinta tapahtuu siinä tapauksessa, että useita kilpailevia sääntöjä sopii käsittelyvuorossa olevaan solmuun Prioriteetti voi olla laskettu tai eksplisiittisesti annettu priority-attribuutilla. Useampi samanarvoinen sääntö samaan kohteeseen on virhetilanne. Oletussäännöillä on alhaisin prioriteetti ja ne syrjäytyvät, jos solmuun liittyy muita sääntöjä yleensä: mitä mutkikkaampi ja spesifisempi valintalauseke sitä korkeampi prioriteetti 9 10 Edellä jo esiintynyt apply-templates elementti ohjaa lähtöpuun käsittelyn etenemistä Oletusarvoisesti (jos apply-templates on mukana) käsitellään vuorossa olevan solmun lapsisolmut elementin puuttuminen katkaisee etenemisen Apply-templates -elementtiin voidaan liittää käsittelyyn vaikuttavia valinnaisia attribuutteja: mode: nimeää ympäristön missä käsittelyä jatketaan select: valitsee solmujoukon jatkokäsittelyn kohteeksi solmujoukko valitaan XPath-lausekkeella, eikä sen tarvitse rajoittua solmun alipuuhun tai edes samaan dokumenttiin apply-templates apply-templates select=".//b" A B B A 11 12 2
<xsl:template match:recipe> <h1><xsl:value-of select="./title" /></h1> <div class="ingr"> <h2>ingredients></h2> <xsl:apply-templates select="./ingredient" /> </div> <div class="nuts"> <xsl:apply-templates select="./nutrition" /> </div> <div class="prep"> <xsl:apply-templates select="./preparation" /> </div> sellaisenaan tulospuuhun käsittely jatkuu Jatkokäsittelyelementin apply-templates sisältöelementeiksi voidaan upottaa sort-elementtejä. Sort-elementit määrittävät käsiteltävien solmujen järjestyksen puujärjestyksestä poikkeavaksi Kukin sort-elementti määrittelee järjestysavaimen osan, merkitsevin ensin select-attribuutti määrittää XPath lausekkeena attribuutin tai elementin, jonka perusteella järjestetään, järjestäminen voidaan määritellä merkkikoodiin tai numeroarvoon pohjautuvaksi ja järjestys nousevaksi tai laskevaksi 13 14 <xsl:template match="//recipe" /> <h3>similar recipes:</h3> <ul><xsl:apply-templates select="./related"> <xsl:sort select="." data-type="text" order="ascending" /> </xsl:apply-templates></ul> </xls:template> 'Muuttuja' <xsl:template match="related" /> <xsl:variable name="x" select="@ref" /> <li><xsl:value-of select="//recipe[@id=string($x)]/title" /></li> Koko puusta :ssä voidaan globaalisti stylesheet - elementin sisällä tai lokaalisti muunnossääntöjen sisällä määritellä muuttujia (oikeastaan nimettyjä vakioita, koska muuttujan arvoa ei voi muuttaa) Nämä määritellään xsl:variable -elementteinä Voi käyttää esimerkiksi tilanteissa, joissa aiemman elementin attribuutti pitää saada käyttöön (aiempi esimerkki) Variable elementissä muuttujalle annetaan nimi (esim. nimi), viitattaessa nimen eteen $ (esim. $nimi) 15 16 Suoraan literaaleina kirjoitettavan sisällön sijaan voi käyttää sisällönmuodostuselementtejä xsl:element xsl:attribute <xsl:template match:recipe> <xsl:element name="h1"> <xsl:value-of select="./title" /> </xsl:element> <xsl:element name="div"> <xsl:attribute name="class" select="'ingr'" /> <xsl:element name="h2"> Ingredients </xsl:element> <xsl:apply-templates select="./ingredient" /> </xsl:element>. 17 18 3
XSL-esimerkki XSL-esimerkki <students> <student id="100026"> <name">joe Average</name> <age>21</age> <major>biology</major> <results> <result course="math 101" grade="c-"/> <result course="biology 101" grade="c+"/> <result course="statistics 101" grade="d"/> </results> </student> <student id="100078"> <name>jack Doe</name> <age>18</age> <major>physics</major> <major>xml Science</major> <results> <result course="math 101" grade="a"/> <result course="xml 101" grade="a-"/> <result course="physics 101" grade="b+"/> <result course="xml 102" grade="a"/> </results> </student> </students> 19 <xsl:apply-templates select="student"/> <xsl:template match="student"> <grades> <xsl:apply-templates select=".//@grade"/> <xsl:template match="@grade"> <grade> <xsl:value-of select="."/> </grade> 20 XSL-esimerkki [tulos] <grades id="100026"> <grade>c-</grade> <grade>c+</grade> <grade>d</grade> <grades id="100078"> <grade>a</grade> <grade>a-</grade> <grade>b+</grade> <grade>a</grade> Aineisto voidaan muunnoksessa käydä läpi useaan kertaan ja tuottaa eri kerroilla erilaisia tuloksia Seuraavassa esimerkissä opiskelija-aineisto käydään läpi kahdesti Usein, kun käytetään useita apply-templates määreitä, näillä on eri vaikutusalue 21 22 -esimerkki -esimerkki <xsl:apply-templates mode="names" select="student"/> <xsl:apply-templates mode="grades" select="student"/> <xsl:template mode="grades" match="student"> <grades> <xsl:apply-templates select=".//@grade"/> <xsl:template mode="names" match="student"> <name> <xsl:value-of select="name"/> </name> <xsl:template match="@grade"> <grade> <xsl:value-of select="."/> </grade> 23 24 4
-esimerkki [tulos] -silmukat <name id="100026">joe Average</name> <name id="100078">jack Doe</name> <grades id="100026"> <grade>c-</grade> <grade>c+</grade> <grade>d</grade> <grades id="100078"> <grade>a</grade> <grade>a-</grade> <grade>b+</grade> <grade>a</grade> Apply-templates rakenteen vaihtoehtona etenemistä puussa voidaan kontrolloida for-each -rakenteella. Läpikäytävät solmut määritellään rakenteen selectattribuutilla. Sisäkkäisten silmukoiden laatiminen on mahdollista for-each -rakenteen sisään voidaan sijoittaa sort-elementtejä kuten apply-templates rakenteeseen 25 26 -silmukat -ehdolliset <xsl:apply-templates select="student"/> <xsl:template match="student"> <grades> <xsl:for-each select=".//@grade"> <grade><xls:value-of select="." /></grade> </xsl:for-each> Tulos sama kuin sivulla 21. 27 Ehdollisesti suoritettavat toiminnot ovat myös mahdollisia. Tarjolla kaksi rakennetta: <xsl:if test="ehto" > do_something </xsl:if> ja <xsl:choose> <xsl:when test="ehto > do_something</xsl:when> <xsl:otherwise> do_otherthing </xsl:otherwise> </xsl:choose> 28 -ehdolliset -ehdolliset <slist> <xsl:apply-templates select="student"/> </slist> <xsl:template match="student"> <xsl:if test="age > 25 and count(.//result)<5"> <std name="{name}"/> </xsl:if> attribute-rakenteelle vaihtoehtoinen tapa atribuuttien määrittelyyn: xmlns:b="http://businesscard.org" <xsl:template match="b:card"> <contact> <xsl:choose> <xsl:when test="b:email"> <xsl:value-of select="b:email"/> </xsl:when> <xsl:when test="b:phone"> <xsl:value-of select="b:phone"/> </xsl:when> <xsl:otherwise> No information available true, jos on </xsl:otherwise> olemassa </xsl:choose> - Ensimmäinen tosi </contact> katkaise evaluoinnin tässä arvoksi elementin name arvo 29 30 5
nimetyt muunnossäännöt nimetyt muunnossäännöt Jos muunnossäännölle on annettu nimi, voidaan sääntöä kutsua suoraan nimellä Nimetyille muunnossäännöille voidaan kutsun yhteydessä välittää myös parametreja xsl:withparam elementillä Muunnossäännön sisällä parametri esitellään xsl:param elementillä <xsl:apply-templates select="student"/> <xsl:template match="student"> <grades> <xsl:for-each select=".//@grade"> <xsl:call-template name="listgrade"/> </xsl:for-each> 31 32 nimetyt muunnossäännöt - rekursiivinen sääntö ja parametrit <xsl:template name="listgrade"> <grade> <xsl:value-of select="."/> </grade> kontekstina kutsun perusteella @grade xsl:stylesheet version="1.0" <xsl:template name="fib"> <xsl:param name="n"/> <xsl:choose> <xsl:when test="$n <= 1 "> <xsl:value-of select="1"/> </xsl:when> 33 Fibonaccin luvut 34 - rekursiivinen sääntö ja parametrit - rekursiivinen sääntö ja parametrit <xsl:otherwise> Kutsuparametrin arvo <xsl:variable name="f1"> <xsl:call-template name="fib"> <xsl:with-param name="n" select="$n -1"/> </xsl:call-template> </xsl:variable> <xsl:variable name="f2"> <xsl:call-template name="fib"> <xsl:with-param name="n" select="$n -2"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$f1+$f2"/> </xsl:otherwise> </xsl:choose> Huom: Tässä täytyy olla väli Edellisen säännön kutsu voisi olla muotoa <xsl:template match="/"> <xsl:call-template name="fib"> <xsl:with-param name="n" select="10"/> </xsl:call-template> 35 36 6
-automaattinen numerointi - automaattinen numerointi number-elementti mahdollistaa tuloselementtien automaattisen numeroinnin count-attribuutti ilmaisee, miltä puun tasolta laskenta aloitetaan format-attribuutti ilmoittaa tuloksen muodon level-attribuutti mahdollistaa elementin sisäisen yksitasoisen (single) monitasoisen (multiple) tai tasojen yli ulottuvan (any) numeroinnin Seuraavassa esimerkissä tehdään reseptiaineistosta kopio, jossa valmistusvaiheisiin (step) on lisätty attribuutti seqno:n arvona vaiheen numero 37 xmlns:rcp="http://www.brics.dk/ixwt/recipes" <xsl:template match="rcp:step"> <rcp:step> <xsl:attribute name="seqno"> <xsl:number level="single" count="rcp:preparation"/> </xsl:attribute> <xsl:apply-templates select="@* *"/> </rcp:step> <xsl:template match="@*"> <xsl:copy/> <xsl:template match="*"> <xsl:copy><xsl:apply-templates/></xsl:copy> 38 xsl:copy kopioi solmun ja siihen liittyvän nimiavaruustiedon, ei kuitenkaan kopioi attribuutteja eikä alipuita automaattisesti xsl:copy-of kopioi solmun attribuutteineen, nimiavaruustietoineen ja alipuineen Muunnossääntöjen XPath lausekkeissa on mahdollista viitata muihin dokumentteihin document(uri) Jos uri on tiedostotason osoite saadaan osoitin dokumentin juurisolmuun Jos uri osoittaa johonkin dokumentin solmujoukkoon (XPointer-osa mukana) saadaan jäljittyvien solmujen kokoelma Jos URI on suhteellinen, se evaluoidaan suhteessa viittaavaan tyylitiedostoon. Ulkoisia elementtejä voidaan käsitellä samoin kuin sisäisiä 39 40 -esimerkki Ulkoisten tiedostojen käsittelyä tuotetietoja http://www.cs.helsinki.fi/u/laine/xml/tuotteet.xml hintatietoja http://www.cs.helsinki.fi/u/laine/xml/hinnat.xml erillinen runko tyylitiedoston kytkemiseksi http://www.cs.helsinki.fi/u/laine/xml/test1.xml xslt-muunnossäännöt http://www.cs.helsinki.fi/u/laine/xml/test1.xsl Muunnosssääntöjoukko voidaan jakaa moduuleihin. Moluulit ladataan xsl:include tai xsl:import elementeillä kummassakin parametrina URI ja sisältönä täydellinen stylesheet elementti xsl:import:lla ladatut voi ylikirjoittaa (samalla prioriteetillä) 41 42 7
esimerkkejä Reseptit 1: http://www.brics.dk/ixwt/examples/recipes.xsl Reseptit 2: Tuottaa uuden XML-tiedoston http://www.brics.dk/ixwt/examples/nutrition.xsl Reseptit 3: Muuntaa edellisen XML:n html:lle http://www.brics.dk/ixwt/examples/nutritiontable. xsl 43 8