360 likes | 470 Views
T3MM65 RAKENTEISET DOKUMENTIT Pläjäys 4. Heikki Hietala HAAGA Ammattikorkeakoulu Helsingin liiketalousinstituutti Kevät 2010. XSLT alkaa tästä. http://www.xml.com/pub/a/2000/08/holman/index.html?page=4. Mitä on XSLT? eXtensible Stylesheet Transformations
E N D
T3MM65RAKENTEISET DOKUMENTITPläjäys 4 Heikki Hietala HAAGA Ammattikorkeakoulu Helsingin liiketalousinstituutti Kevät 2010
XSLT alkaa tästä http://www.xml.com/pub/a/2000/08/holman/index.html?page=4 • Mitä on XSLT? • eXtensible Stylesheet Transformations • Muuntaa XML:n esitysmuotoon XSLT-prosessissa, jossa XML:ään lisätään halutun esitysmuodon mukainen tyyli:
Mitä siis muunnetaan ja miksi? • Esimerkiksi XML:ää HTML:ksi tai puhtaaksi tekstiksi:
Transformaatio voi tapahtua serverillä tai vasta asiakassovelluksessa • Server-side transformation on alla, client-side yllä
Miltä XSLT näyttää? Tämä XML <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="hello.xsl"?> <greeting>Hello world.</greeting> *** ja tämä XSL **** <?xml version="1.0"?><!--hello.xsl--> <xsl:template match="/"> <b><i><u><xsl:value-of select="greeting"/></u></i></b> </xsl:template> tuottavat
Osaset <?xml version="1.0"?> Julistus <xsl:template match="/"> Xpath – funktio joka vastaa juurielementtiä <b><i><u> muotoiluja <xsl:value-of select="greeting"/> Elementin ”greeting” arvo </u></i></b> muotoilut loppuvat </xsl:template> template loppuu
Mistä XSLT:ssä on kyse? • XSLT on ohjelmointikieli, jolla tehdään datalle muunnoksia yhdestä muodosta toiseen. • xsl:template on kaiken perusta. Se on sääntöpohjaisen transformaation pohjana. • Prosessoidaan joko match- tai name-attribuutin pohjalta • Match käyttäää mallia liipaisimena • Name käyttää nimeä • Xsl:templatea kutsutaan xsl:apply-template –funktiolla • xsl:apply-template on aina templaten sisäpuolella • xsl:apply-template määrittää, mitä templaten solmua kutsutaan, eli se on ikään kuin aliohjelmakutsu
Tässä on pätkä XML:ää <?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="filmi1.xslt"?> <filmikirjasto> <filmi> <nimi>Blues Brothers</nimi> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <ensiesitys>1.1.1980</ensiesitys> <oscar>true</oscar> </filmi> <filmi> <nimi>Blues Brothers 2000</nimi> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <kirjoittaja>James Belushi</kirjoittaja> <ensiesitys>1.1.2000</ensiesitys> <oscar>false</oscar> </filmi> </filmikirjasto>
Vastaava XSLT <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="filmi"> <html> <basefont face="Verdana" size="2" /> <body> <!--Käytetään kaikki templateja juurisolmusta alkaen--> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="filmi"> <!--kun vastaan tulee elementti "filmi"--> <p> <font face="verdana" color="steelblue" size="3"> <b>Filmi: <xsl:apply-templates /> </b> </font> </p> </xsl:template>
Jatkuu… <xsl:template match="ohjaaja"> <!--kun vastaan tulee elementti "ohjaaja"--> <p> <font face="verdana" color="navy" size="2"> <xsl:apply-templates /> </font> </p> </xsl:template> <xsl:template match="kirjoittaja"> <!--kun vastaan tulee elementti "kirjoittaja"--> <p> <font face="verdana" size="1"> <xsl:apply-templates /> </font> </p> </xsl:template>
Loppupala… <xsl:template match="ensiesitys"> <!--kun vastaan tulee elementti "ensiesitys"--> <font face="verdana" size="2"> <b>Ensiesitys: </b><xsl:apply-templates /></font><br/> </xsl:template> <xsl:template match="oscar"> <!--kun vastaan tulee elementti "oscar"--> <p>Oscar saatuna: <i> <xsl:value-of select="." /> </i></p> <hr></hr> </xsl:template> </xsl:stylesheet>
XSLT käy läpi kaikki solmut, ja toimii sen mukaan, millainen elementti juuresta alkaen löytyy XSLT:hen voi liittää tekstiä (filmi) Muotoilut (hr) Ja miltä se näyttää?
Otetaanpa pala kerrallaan. • XML-fileeseen tulee kirjata, mitä xsl-tyylitiedostoa käytetään. <?xml:stylesheet type="text/xsl" href=”filmi.xsl"?> • XSL-fileeseen tulee kirjata, mikä on namespace, alla uusin: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> • Jos lausekkeessa ei käytetä etuliitettä xsl:, parseri lataa sen tekstinä tulosteeseen • Näin käy HTML-datalle XSL:n sisällä.
Sitten alkaa prosessointi <xsl:template match=" ... "> • Prosessointi alkaa XPath-lausekkeella joka valitsee sen XML-elementin, jota käsitellään. • Useimmiten valitaan solmu käyttäen operaattoria match • Jos valitaan koko dokumentti, valitaan juurisolmu sanomalla match="/" • Toinen mahdollisuus on valita dokumenttielementti match=”filmikirjasto"
Tässä luodaan ensin taulukko ja sitten lähdetään silmukkarakenteeseen <table> <xsl:for-each select=”filmikirjasto/filmi”> <tr><td> <xsl:value-of select=”nimi" /> </td> jne… </tr> </xsl:for-each> </tr></table> Jokaiselle elementille omansa Entäs jos halutaan tehdä taulukko?
Valmis XSLT, osa 1 <?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <HTML> <BODY> <TABLE BORDER="2"> <TR> <TD>Nimi</TD> <TD>Ohjaaja</TD> <TD>Kirjoittaja</TD> <TD>Kirjoittaja</TD> <TD>Ensi-ilta</TD> <TD>Oscar</TD> </TR> <xsl:for-each select=”filmikirjasto/filmi"> <TR> <TD> <xsl:value-of select=”nimi" /> </TD> <TD> <xsl:value-of select=”ohjaaja" /> </TD>
Valmis XSLT, osa 2 <TD> <xsl:value-of select=”kirjoittaja" /> </TD> <TD> <xsl:value-of select="kirjoittaja" /> </TD> <TD> <xsl:value-of select=”ensi-ilta" /> </TD> <TD> <xsl:value-of select=”oscar" /> </TD> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
Hugo Bernier’s XSLT • Here are some tricks for trying to solve XML Transformation issues: • Start your XML file with <?xml-stylesheet type="text/xsl“ href="yourxslfilehere" ?> • You can then double-click on your XML file and view it in your browser. If the transformation works, you'll see HTML.
Hugo Bernier’s XSLT 2 • Start from the root: When I design XSL files, I always start with the root node (/) and work down the tree. In other words, I'll start with: <xsl:template match="/"> It works! </xsl:template> • then, I change the template's match parameter to get to the node I want... <xsl:template match="/blog"> It still works! </xsl:template> • ...and continue doing so until I get the results I want. Doing so will not only avoid you lots of headaches, but could result in significant performance improvements.
Hugo Bernier’s XSLT 3 • Add HTML: to get the pretty results I want • Add Code: now that I got the XSLT I want, producing the output I want, I'll add the code to display it (in your case, the ASP file). • By using the browser's ability to display XML/XSL Tranformations, I can produce fancy XSL without needing a fancy development tool.
Hugo Bernier’s XSLT 4 • Add Parameters: one last bit I'll do is add XSL parameters. • For example, you could use one XSLT file with a language parameter, and use an xsl:choose statement to display the right results... • I'll also create XSLT Extensions, which are bits of compiled code (e.g. C#) that get passed as parameters to the XSLT document. • For example, you could have an XSLT Extension that formats dates, or calculate the answer to life, the universe, and everything.
XPathin perusteet • XPath on se systeemi, joka sallii XML-puussa kiipeilyn. • XPath ja XSLT ovat molemmat W3C:n luomia standardeja, mutta käytännössä on vaikea erottaa niitä toisistaan • Periaatteessa XPath vie jonnekin ja siellä perillä XSLT tekee jotakin. • Käsite ’konteksti’ tarkoittaa sitä solmua tai elementtiä XML-puussa, jota käsitellään • Konteksti xsl:template match=”/” on siis juurielementin käsittelyä varten
XPathia lisää • Sijaintipolulla tarkoitetaan XML-elementin kontekstia XML-puussa • Aloitetaan juuren kontekstista ”/” • Sijaintipolun voi koodata joko lyhennettynä tai lyhentämättömänä • Lyhennetty on helpompi ja yleisempi.
XPath 3 • Jos esimerkissä lisätään uusia tasoja xml-rakenteeseen, esim. <filmikirjasto> <ulkomaalaiset> <filmi>…</filmi> • Esimerkin for-each, filmikirjasto/filmi lakkaa toimimasta. • Lyhentämätön sijaintipolku olisi <xsl:for-each select="child::filmikirjasto/descendant::filmi"> • Lyhennetty on <xsl:for-each select=”filmikirjasto//filmi”>
Kertaukseksi siis polusta: • ”element” valitsee kaikki kontekstisolmun lapset, jotka kuuluvat elementtiin ”element” • ”/” valitsee juurisolmun kontekstin • ”/filmi” valitsee juurisolmun lapsen ”filmi” • ”filmikirjasto/filmi” valitsee kaikki filmikirjasto-elementin filmi-lapset • ”//filmi” valitsee filmi-elementin, oli se sitten kuinka syvällä xml:n rakenteessa tahansa • ”Filmikirjasto//filmi” valitsee filmi-elementit, riippumatta siitä, montako tasoa on filmikirjasto- ja filmi-elemettien välissä.
Axis ja Predicate • Axis on luettelo solmuista kontekstin varrella • Predicate on axisin määre, jolla voi valita solmuja jonkin arvon perusteella
Node-set • Node-sets eli solmujoukot saadaan kyselyistä filmi[kirjoittaja=”Mika Waltari" and kirjoittaja=”Bo Carpelan"]
… lisää … • Count-funktio laskee solmujoukon ehdot täyttävien solmujen määrän, eli alla niiden filmien määrän, joilla elementti oscar on tosi <xsl:template match=”/”> <xsl:value-of select="count(filmikirjasto/filmi[oscar=true])"/> </xsl:template> • Jos tässä konteksti on filmikirjasto, voidaan sanoa <xsl:value-of select="count(filmi[oscar=true])"/>
Position • Position palauttaa solmun paikan suhteessa kontekstiin • Kätevä esim. jos on lisättävä solmu tiettyyn kohtaan elementissä tai varmistettava onko kontekstin solmu ylemmän tason elementin viimeinen solmu (eli onko position() sama kuin last() <?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:for-each select=”filmikirjasto/filmi"> <p><xsl:number value="position()"/>. <xsl:value-of select="name"/></p> </xsl:for-each> </xsl:template></xsl:stylesheet> • tuottaa • Blues Brothers • Blues Brothers 2000 • Sinuhe Epyktiläinen
Position • Position palauttaa solmun paikan suhteessa kontekstiin • Kätevä esim. jos on lisättävä solmu tiettyyn kohtaan elementissä tai varmistettava onko kontekstin solmu ylemmän tason elementin viimeinen solmu (eli onko position() sama kuin last() <?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:for-each select=”filmikirjasto/filmi"> <p><xsl:number value="position()"/>. <xsl:value-of select="name"/></p> </xsl:for-each> </xsl:template></xsl:stylesheet> • tuottaa • Blues Brothers • Blues Brothers 2000 • Sinuhe Epyktiläinen
Substring • Substring palauttaa halutun määrän merkkejä elementistä <?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:for-each select=”filmikirjasto/filmi"> <p><xsl:number value="substring(name, 1, 7)"/></p> </xsl:for-each> </xsl:template></xsl:stylesheet> • tuottaa Blues B Blues B Sinuhe • XPath-funktioita on vaikka kuinka paljon lisää.
XSLT: value-of • xsl:value-oftuottaa elementin arvon muunnoksen tulostettavaan muotoon • xsl:apply-templatestulostaa myös tekstiä, mutta se tutkii myös kontekstin node-setin jos ei erikseen kielletä niin tekemästä • xsl: value-oftuottaa vain kyseisen elementin arvon tulostuksen. • Tekstiä voidaan myös tehdä : - kirjoittamalla tekstiä tyylisivulle:<p> tämä on tekstiä </p> - <xsl:copy> - <xsl:copy-of>
XSLT: for-each <xsl:for-each select=“filmikirjasto/filmi"> <TR> <TD><xsl:value-of select=“nimi"/></TD> <TD><xsl:value-of select=“ohjaaja"/></TD> <TD><xsl:value-of select=“kirjoittaja"/></TD> <TD><xsl:value-of select=“kesto"/></TD> <TD><xsl:value-of select=“oscar"/></TD> </TR> </xsl:for-each> • Lykkää taulukkoon omiin soluihinsa kaikki tiedot • Taulukon avaus ja sulkeminen tehdään juurisolmun apply-templatessa
XML ja CSS <?xml stylesheet type=”text/css” hrf=”filmi.css”?> • liittää XML-tiedostoon CSS-tiedoston FILMI { font-family:sans-serif;} NIMI { display:block; Font-size:2em; Text-align:center} OHJAAJA{ Display:block; Font-size:1.1em; Padding:0.5em; Text-align;center; } jne • Tuottaa aivan normaalin HTML CSS-tyylin mukaiset esitykset
XSLT: value-of=”.” • xsl:value-of=”.” tuottaa kontekstin elementin sisällön. • Jos elementillä on lapsia, ne tulostetaan myös <xsl:template match=”filmi"> <p> <xsl:value-of select="." /> </p> </xsl:template> • tuottaa kaikki tekstiarvot peräkkäin.