Juonoja Timo
xsl ja sen hyödyntäminen XML-dokumentEISSA
Tietotekniikan LuK-tutkielma
3.9.2004
Tekijä: Timo Juonoja
Yhteystiedot: puhelin 044-3754223, sähköposti timo.juonoja@jyu.fi.
Työn nimi: XSL ja sen hyödyntäminen XML-dokumenteissa.
Title in English: XSL and using it in XML documents.
Työ: LuK-tutkielma
Sivumäärä: 38+7
Linja: Tietoliikenne
Teettäjä: Jyväskylän yliopisto, tietotekniikan laitos
Avainsanat: XSL, XPath, XSLT, XML, rakenteiset dokumentit, XML-dokumentin muunnos, XML-dokumentin muotoilu.
Keywords: XSL, XPath, XSLT, XML, structured documents, transforming XML document, formatting XML document.
Tiivistelmä: Tutkielmassa tarkastellaan XML-kielisen dokumentin muotoiluun käytettävää XSL-standardia. XML-dokumentti ei määritä dokumentin esitysasua, joten sen muotoilussa käytetään XSL-tyylitiedostoa. XSL:n avulla XML-dokumentti voidaan muuntaa toiseen dataformaattiin tai muotoilla tulostettavaan muotoon.
Abstract: This thesis examines XSL standard,
which can be used to format XML-based document. XML document doesn’t specify the
outlook of a document, so it needs an XSL styledocument for formatting. An XML document
can be transformed with XSL into another dataformat or formatted for printing.
Tutkielma pohjautuu Neil Bradleyn loistavaan XSL-aiheiseen kirjaan nimeltä ”The XSL Companion” [1]. Tutkielma on periaatteessa lyhennelmä Bradleyn kirjasta ja tutkielmassa on pyritty tuomaan esille lähinnä kirjan pääkohdat.
Tämän tutkielman kirjoittaminen oli mielenkiintoista. Siitä olisi voinut saada paljon syvällisemmän ja pitemmänkin aikaan. Mikäli sinulla on kiinnostusta aiheeseen, suosittelen Bradleyn kirjan lukemista. Kirja käy läpi XSL:n hyvin tarkasti ja selkeästi.
WWW (World Wide Web) on hypertekstidokumentteihin perustuva järjestelmä, jossa aineisto on jäsennetty loogisiksi sivuiksi.
XML (eXtensive Markup Language) on rakenteisten dokumenttien määrittelykieli, joka pohjautuu SGML:ään.
XSL (eXtensible Stylesheet Language) on XML-dokumenttien muotoilustandardi.
HTML (HyperText Markup Language) on WWW-sivujen kuvauskieli.
W3C (the World Wide Web Consortium) on standardointijärjestö, joka vastaa WWW:n taustalla olevasta teknologiasta.
SGML (Standard Generalized Markup Language) on rakenteisten dokumenttien määrittelykieli.
URL (Uniform Resource Locator) on tapa ilmoittaa tiedon sijainti Internetissä.
CSS (Cascading Style Sheets) on WWW-sivujen muotoilustandardi.
Sisältö
2.6 XSL, XSLT ja XPath yhdessä
3.3 Tyylipohjan jakaminen useaan tiedostoon
3.4 Muunnossääntöjen määrittäminen
3.5 Lapsielementit ja niiden käsittely
3.7 Elementtien sisällön käsittely
3.10 Muiden sisältötyyppien luonti
3.14 Nimetyt template-elementit
4 Kohteiden
poimiminen XPathin avulla
4.2 XPath-lausekkeen konteksti
XML-hierarkiassa
4.3 XPath-lausekkeen lisämäärityksiä
5.1 Juurielementti ja sivuelementit
5.11 Yksittäisten kirjainten muotoilu
Liite 1:
Esimerkki XML-tiedostosta
Liite 2:
Esimerkki XSL-muunnostiedostosta
Liite 3: XML-tiedoston
HTML-muotoinen tuloste
Liite 4:
Esimerkki DTD-tiedostosta
Nykyiset tekstinkäsittelyohjelmat eivät sovellu hyvin informaation tallentamiseen, mikäli dokumentteja on tuhansia ja niiden vaatimukseen kuuluu dokumentin pitkäikäinen käytettävyys. Rakenteiset dokumentit tuovat ratkaisun pitkäikäisyyttä vaativien dokumenttien tallennusmuotoon.
Rakenteinen dokumentti koostuu rakenneosista eli elementeistä ja niiden sisältämästä informaatiosta. Dokumentin rakenne noudattaa jotakin tiettyä rakennekuvausta (esimerkiksi HTML tai itse luotu) ja dokumentti tulee laatia rakennetta vastaavaksi. Koska puhdas rakenteinen dokumentti ei määrittele dokumentin esitysasua, käyttäjän ei tarvitse kirjoitusvaiheessa huolehtia ulkoasuun liittyvistä seikoista, vaan hän voi keskittyä dokumentin sisällön oikeellisuuteen. Informaatio voidaan rajata ja muotoilla kyseisen tarpeen mukaiseen esitysmuotoon jälkeenpäin.
Rakenteisten dokumenttien rakenne noudattaa puurakennetta. Puurakenteen perusolioita ovat puun solmut ja ylimpänä juurisolmu. Hierarkkinen rakenne määrittelee dokumentin elementit puun solmuina ja niiden lapsielementit kyseisen solmun alisolmuina (katso kuva 1).
Kuva 1.
Puurakenne.
XML (eXtensive Markup Language) on rakenteisten dokumenttien määrittelykieli. XML-standardiperhe on SGML:ää (Standard Generalized Markup Language) yksinkertaistetumpi rakenteisten dokumenttien määrittelykieli, mutta se noudattaa SGML:ää.
XML-dokumentti ei määrittele dokumentin esitysasua. XSL (eXtensible Stylesheet Language) on tyylistandardi, joka määrittelee esitysmuodon XML-dokumentin elementeille.
W3C:n vuonna 1997 standardoima XSL voidaan edelleen jakaa kolmeen standardiin. XPath määrittelee mekanismin paikallistaa tietoa XML-dokumenteista. XSLT mahdollistaa XML-dokumenttien muuntamisen joihinkin muihin dataformaatteihin. Formatting Objectsia (FO, XSL:FO tai yksinkertaisesti XSL) käytetään muotoilutietojen upottamiseen XML-dokumentteihin. XML-standardiperheeseen kuuluu myös XLink, joka määrittelee dokumentin hypertekstilinkkejä. Kuvassa 2 on XML-standardiperhe joukko-opillisesti havainnollistettuna.
Kuva 2. XML-standardiperhe.
Luvussa 2 käsitellään lyhyesti XSL:n toimintaperiaatetta. Kolmas luku keskittyy XSL-muunnokseen. Luvussa 4 käsitellään XPath-kielen syntaksia. Viidennessä luvussa tarkastellaan XSL-muotoilusääntöjä ja -objekteja.
XSL-tyylistandardi on tarkoitettu XML-dokumenttien tyylipohjien (engl. stylesheets) määrittelyyn. XSL:n avulla voidaan lisätä, poistaa, lajitella tai järjestellä elementtejä tulosdokumenttiin. XSL:n tarkoituksena on tuottaa XML-dokumentista muotoiltu versio erilaisiin julkaisuympäristöihin, kuten esimerkiksi WWW-selaimiin, matkapuhelimiin tai tulostamista varten. Luku pohjautuu Neil Bradleyn kirjaan [1, luku 2] sekä Jouni Heikniemen dokumenttiin [4].
XML on metakieli, jolla määritellään rakenteellisia merkkauskieliä. XML-dokumentti muodostuu elementeistä.
Seuraavassa esimerkissä määritellään henkilo-elementti:
<henkilo tyyppi=”tarkea”>Timo Juonoja</henkilo>
Elementti henkilo määritellään <henkilo>-alkutagin ja </henkilo>-lopputagin avulla. Elementin sisältö (Timo Juonoja) sijoitetaan tagien väliin. Elementin attribuutit (tyyppi) määritellään alkutagiin ja sen sisältö sijoitetaan lainausmerkkien väliin (tarkea).
XML-dokumentti tarvitsee vielä kieliopin määrittelemään elementit, joihin kuuluvat attribuutit ja elementtien väliset suhteet. Kielioppi määritellään DTD:llä (Document Type Definition) tai XML Schema -määrittelyllä. Näitä asioita ei kuitenkaan käsitellä tutkielmassa.
XSL-prosessissa on pääpiirteittäin kaksi vaihetta (katso kuva 3):
· XSL-muunnoksella lähdedokumentti muunnetaan sopivaan muotoon.
· XSL-muotoilulla määritellään XML-dokumentin ulkoasu.
Kuva 3. XSL-prosessin kaksi vaihetta ovat muunnos ja muotoilu [3].
XSL-standardi on jaettu kolmeen eri standardiin: XSLT, XSL:FO ja XPath. Luvuissa 2.3-2.5 esitellään kyseiset standardit. Tämän jälkeen luvuissa 2.6 ja 2.7 kuvataan, miten niitä käytetään yhdessä määrittämään XML-dokumentin ulkoasua.
XSLT on muunnoskieli, jolla XML-dokumentteja voidaan muuntaa muihin dataformaatteihin. XSLT:tä käytetään tällä hetkellä eniten XML-dokumenttien muuntamiseen HTML-muotoon.
Seuraava esimerkki muuntaa XML-tiedoston osan HTML-muotoon ja määrittää kappaleen:
<kappale>
<korostettu>Lihavoitu</korostettu> termi
</kappale>
XSL-säännöstöllä
<xsl:template match=”kappale”>
<html:P>
<xsl:apply-templates/>
</html:P>
</xsl:template>
<xsl:template match=”korostettu”>
<html:B>
<xsl:apply-templates/>
</html:B>
</xsl:template>
XML-esimerkki muuntuu HTML-muotoon
<P><B>Lihavoitu</B>
termi</P>
Luvussa 3 käsitellään XSL-muunnokseen liittyviä asioita tarkemmin.
XSL Formatting Objects (XSL:FO) on tarkoitettu dokumentin ulkoasun kuvaamiseen. XSL:FO sisältää yli 50 erilaista elementtiä, joilla on vielä useita parametreja.
Seuraava esimerkki määrittelee säännön vahvennus-elementille muuntamalla elementin sisällön vahvennetuksi:
<xsl:template match=”vahvennus”>
<fo:block font-weight=”bold”>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
Tätä sääntöä voisi soveltaa seuraavaan XML-dokumentin osaan:
<vahvennus>Tämä on vahvennettu lause.</vahvennus>
Luvussa 5 käsitellään XSL-muotoilua perusteellisemmin.
XSLT:hen liittyy vielä XPath-kieli, jolla voidaan osoittaa dokumentin eri kohtia. XPath-kieli ei ole XML-perustainen, mutta sen syntaksi on suunniteltu sopivaksi moniin eri käyttötarkoituksiin.
Seuraava esimerkki ottaa käsittelyyn elementin luku alielementin kappale, jonka tyyppi-attribuutti on keskeinen:
luku//kappale[@tyyppi=’keskeinen’]
Tätä sääntöä voisi soveltaa seuraavaan XML-dokumentin osaan:
<luku>
<kappale tyyppi=”keskeinen”>
Tämä kappale on keskeinen.
</kappale>
</luku>
Luvussa 4 käsitellään XPath-kielen syntaksia tarkemmin.
XSLT yhdessä XPathin kanssa tarjoaa ihanteellisen tavan muuttaa XML-dokumentti XSL-dokumentiksi. Tarkastellaanpa asiaa esimerkin avulla. kappale-elementti muutetaan tulospuuhun korostetuksi, jos ja vain jos se on luku-elementin sisällä ja sisältää arvon keskeinen tyyppi-attribuutissa. Tämä tapahtuu seuraavasti:
<template match=”luku//kappale[@tyyppi=’keskeinen’]”>
<fo:block font-style=’bold’>
<apply-templates/>
</fo:block>
</template>
XSLT-prosessori on ohjelma, joka muuntaa XML-dokumentin XSL-dokumentiksi (katso XSL-muunnos kuvassa 3 sivulla 4). Tämän jälkeen XSL-prosessori tulkitsee dokumentin sisällön ja muotoilee sen tyypillisesti paperille tai näytölle (katso XSL-muotoilu kuvassa 3).
Jotkut XSL- ja XSLT-prosessorit ovat
integroituina tietokoneohjelmiin (kuten WWW-selaimiin), joiden täytyy kuitenkin
tukea kaikkia kolmea standardia. Tällöin voidaan puhua upotetuista
prosessoreista (engl. embedded processors). Microsoftin Internet Explorer on esimerkki
upotetusta XSLT-prosessorista.
Kuitenkin jotkut XSL- tai XSLT-prosessorit eivät ole aivan täysin upotettuja ohjelmiin, jolloin voidaan puhua erillisistä prosessoreista (engl. standalone processors). Ne tuottavat erillisiä tiedostoja, joita muut tietokoneohjelmat voivat myöhemmin tulkita. Esimerkiksi Apachen FOP toimii erillisenä XSL-prosessorina.
XSL-muunnoksessa XML-dokumentti muutetaan johonkin toiseen dataformaattiin tai erilaiseksi XML-dokumentiksi. Luku pohjautuu Neil Bradleyn kirjaan [1, luvut 3-5, 8-10, 12, 15 ja 16]. Lisäksi liitteistä 1-4 löytyy tekstiä tukevia esimerkkejä.
Nimiavaruuksia (engl. namespaces) käytetään määrittämään käytettävien elementtien standardityypit. Nimiavaruudet määritellään <xsl:stylesheet>-elementissä xmlns-attribuutissa seuraavasti:
<xsl:stylesheet
xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”
xmlns:fo=”http://www.w3.org/1999/XSL/Format”>
Niihin viitataan seuraavasti:
<fo:block>... </fo:block>
Oletusnimiavaruudessa viittausta ei suoriteta. Oletusnimiavaruus määritellään seuraavasti:
<xsl:stylesheet
xmlns=”http://www.w3.org/1999/XSL/Transform”>
XSL-muunnostiedosto eli -tyylipohja (engl. stylesheet) alkaa <xsl:stylesheet>-elementillä. Elementillä on kaksi attribuuttia: version ja xmlns. version-attribuutti määrittelee XSLT:n versionumeron (oletusarvona 1.0) ja xmlns-attribuutti identifioi nimiavaruudet.
Kuvassa 4 XSLT-tyylipohja on upotettu XML-dokumenttiin. Tämä voidaan tehdä, koska tyylipohja on myös XML-rakenteinen.
Kuva 4. Tyylipohja on upotettu XML-tiedostoon.
XML-dokumentista voidaan myös viitata erilliseen XSLT-tyylipohjatiedostoon. Tällä tavalla samaa tyylipohjaa voidaan käyttää useassa eri XML-dokumentissa. Kuvassa 5 on esitettynä viitattu tyylipohja.
Kuva 5. Tyylipohjaan viitataan XML-tiedostosta.
XML-dokumentissa viittaus XSLT-tyylipohjaan tapahtuu komennolla
<?xml-stylesheet type=”text/xml” href=”muunto.xsl”?>
jossa type-parametri määrittelee tyylipohjan kielen ja href-parametri sen URL-osoitteen (Uniform Resource Locator).
XML-dokumentin ja XSLT-tyylipohjan voi myös viedä erikseen XSLT-prosessorille. Tällöin kyseessä on linkittämätön tyylipohja (katso kuva 6).
Kuva 6. Linkittämätön tyylipohja.
XSLT-tyylipohjan voi myös jakaa useaan tiedostoon. Toisen XSL-tiedoston liittäminen toiseen XSL-tiedostoon voi tapahtua kahdella eri tavalla:
<include href=”muunto.xsl”/>
tai
<import href=”muunto.xsl”/>
Ainut ero näiden kahden ”paloittelemistavan” välillä on, että import-liittämisellä voidaan uudelleenmääritellä (engl. override) <xsl:template>-elementtejä.
Jokainen XML-dokumenttia muuntava sääntö määritellään <xsl:template>-elementillä. match-attribuuttia käytetään yksilöimään elementti, johon sääntö kohdistuu.
kappale-elementtiin kohdistuva sääntö määritellään XSL-tiedostossa seuraavasti:
<xsl:template match=”kappale”>... </xsl:template>
Edellistä XSL-sääntöä voidaan soveltaa mm. seuraavaan XML-tiedoston osaan:
<otsikko>Otsikko<otsikko>
<kappale>Otsikon aiheesta
koostuva kappale.</kappale>
Lapsielementit ovat jonkun elementin sisällä olevia elementtejä. Niiden käsittely ei ole automaattista, vaan siihen tarvitaan oma eksplisiittinen määrittely elementillä <xsl:apply-templates>. Tämän elementin select-attribuutilla voidaan valita, mitkä lapsielementit käsitellään ja mitkä jätetään käsittelemättä.
Seuraavassa esimerkissä otsikko-elementin lapsielementeistä käsitellään vain kappale-elementti:
<xsl:template match=”otsikko”>
<xsl:apply-templates
select=”kappale”/>
</xsl:template>
Elementin korvaaminen tarkoittaa lähdedokumentin elementin nimen muuttamista tulosdokumenttiin. Tämä voidaan tehdä kahdella tavalla, joilla molemmilla on omat etunsa ja heikkoutensa. Ensimmäisessä tavassa vain lisätään tulosdokumentin elementit templaten määrittelyyn seuraavasti:
<xsl:template match=”otsikko”>
<h2><xsl:apply-templates/></h2>
</xsl:template>
Toinen tapa on käyttää XSLT-elementtiä <xsl:element>, jonka name-attribuutti määrittelee käytettävän tulosdokumentin elementtityypin. Tämä tehdään seuraavasti:
<xsl:template match=”otsikko”>
<xsl:element name=”h2”>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
Joskus on tarvetta päästä käsiksi elementtien sisältöön. <xsl:value-of>-elementillä voidaan halutun elementin sisältö saada poimittua select-attribuutin avulla.
Seuraavassa esimerkissä elementtien etu ja suku sisältö sijoitetaan tulosdokumenttiin. Sovellettaessa XML-koodiin
<nimi>
<etu>Timo</etu>
<suku>Juonoja</suku>
</nimi>
XSL-säännöstöä
<xsl:template match=”nimi”>
<xsl:text>Etunimi: </xsl:text>
<xsl:value-of select=”etu”/>
<xsl:text>
Sukunimi: </xsl:text>
<xsl:value-of select=”suku”/>
</xsl:template>
saadaan tulosdokumentin lopputulokseksi
Etunimi: Timo Sukunimi: Juonoja
XML-dokumentin muuntamisessa HTML-muotoon tarvitaan mekanismi, jolla voidaan tunnistaa XSL-tiedostosta helposti HTML-elementit. <xsl:output>-elementin method-attribuutilla täsmennetään haluttu tulosformaatti, joka voi olla xml, html tai text. Attribuutti version kertoo HTML-version.
<xsl:output>-elementti tulee sijaita heti <xsl:stylesheet>-elementin jälkeen seuraavalla tavalla:
<xsl:stylesheet ...>
<xsl:output method=”html” version=”4.0” ...
/>
</xsl:stylesheet>
Muunnoksessa voi määrätä myös HTML-dokumentin tyypin attribuuteilla doctype-public ja doctype-system seuraavasti:
<xsl:output ... doctype-public=”html...”
doctype-system=”html4.0.dtd” />
Yllä olevan koodin vaikutus tulosdokumenttiin on seuraavanlainen:
<!DOCTYPE HTML PUBLIC ”-//html...” ”html4.0.dtd”>
<HTML>...</HTML>
encoding-attribuutilla määritellään tulosdokumentissa käytettävä merkistö seuraavalla tavalla:
<xsl:output ... encoding=”ISO-8859-1” />
XML-dokumentti voidaan muuntaa toiseksi XML-dokumentiksi. Tulosformaatin määritteleminen XML-muotoon tapahtuu seuraavasti:
<xsl:output method=”xml” ...>
Attribuutilla omit-xml-declaration määritellään, asetetaanko tulosdokumenttiin XML-määrittely (arvo no) vai ei (yes). standalone-attribuutti määrittelee puolestaan, käytetäänkö elementtien tarkkaan kuvaukseen DTD-määrittelyä (arvo no) vai ei (yes).
Seuraavassa esimerkissä tulosdokumenttiin tehdään XML-määrittely sekä standalone-määrittely ja käytetään merkistöä ISO-8859-1. XSL-tiedoston XML-määrittely
<xsl:output omit-xml-declaration=”no”
standalone=”yes” encoding=”ISO-8859-1”/>
saa tulosdokumentin alkuun XML-määrittelyn
<?xml version=”1.0” encoding=”ISO-8859-1”
standalone=”yes”?>
Elementillä <xsl:text> voidaan luoda tavallista tekstiä. Se on hyödyllinen esimerkiksi silloin, kun halutaan tulosdokumenttiin välilyöntejä. Tämä hoituu seuraavalla määrittelyllä:
<xsl:text> </xsl:text> <!-- välilyönnin lisääminen -->
<xsl:comment>-elementillä voidaan luoda tulosdokumenttiin kommentteja. Elementin sisältö laitetaan tulosdokumentissa merkkijonojen <!-- ja --> väliin. XSL-komento
<xsl:comment>Tämä on kommentti</xsl:comment>
luo siis tulosdokumenttiin lauseen
<!--Tämä on kommentti-->
Lajittelu tehdään elementin <xsl:sort> avulla. Tietoa voidaan lajitella esimerkiksi aakkos- tai numerojärjestykseen. data-type-attribuutin avulla määritellään haluttu lajittelutapa. Arvolla text lajitellaan aakkosjärjestykseen ja arvolla number numerojärjestykseen.
Seuraavassa esimerkissä lajitellaan numerot pienimmästä suurimpaan. Lajiteltaessa XML-koodia
<numerot>
<nro>345</nro>
<nro>12</nro>
<nro>678</nro>
</numerot>
XSL-säännöstöllä
<xsl:template match=”numerot”>
<DIV>
<xsl:apply-templates>
<xsl:sort
data-type=”number” />
</xsl:apply-templates>
</DIV>
</xsl:template>
<xsl:template match=”nro”>
<P><xsl:apply-templates/></P>
</xsl:template>
saadaan aikaiseksi HTML-muotoinen lopputulos
<DIV>
<P>12</P>
<P>345</P>
<P>678</P>
</DIV>
Listoissa käytettävä numerointi toteutetaan elementin <xsl:number> avulla. XML-dokumenttia muunnettaessa HTML-muotoon kannattaa kuitenkin käyttää HTML-elementtejä <OL> ja <LI>.
format-attribuutin avulla määritellään haluttu numerointitapa. Aakkoselliset listat saadaan aikaan arvolla a tai A sekä roomalainen numerointi arvolla i tai I. Tavallinen numeerinen numerointi on oletusarvona. count-attribuutin avulla voidaan laskea elementin esiintymiskertoja, jonka mukaan määräytyy numeroinnin arvo (katso esimerkki liitteestä 2).
Seuraavassa on esimerkki numeroinnista. XML-koodin
<nro>Käy pesulla</nro>
<nro>Pese hampaat</nro>
<nro>Mene nukkumaan</nro>
käsittely XSL-säännöstöllä
<xsl:template match=”nro”>
<P><xsl:number/>)
<xsl:apply-templates/></P>
</xsl:template>
saa aikaan HTML-muotoisen tuloksen
<P>1) Käy pesulla</P>
<P>2) Pese hampaat</P>
<P>3) Mene nukkumaan</P>
Muuttujia määritellään elementin <xsl:variable> avulla. Määritys tehdään suoraan elementin <xsl:stylesheet> alle. Attribuutilla name määritellään muuttujan nimi. Viittaus muuttujaan koodissa tapahtuu name-attribuutin arvolla, johon on lisättynä dollarimerkki $ eteen.
Seuraavassa on havainnollistava esimerkki. XSL-säännöstölle
<xsl:variable name=”tekija”>
Timo Juonoja
</xsl:variable>
<xsl:template match=”tekija”>
<html><head></head><body>
Sivun
tekijä: <xsl:value-of select=”$tekija” />
</body></html>
</xsl:template>
saadaan HTML-muotoiseksi tulokseksi
<html><head></head><body>
Sivun tekijä: Timo Juonoja
</body></html>
Elementille <xsl:template> (katso luku 3.4) voidaan määritellä myös nimi name-attribuutin avulla. Nimetty <xsl:template>-elementti toimii funktion kaltaisena määrityksenä. Kutsut tehdään elementillä <xsl:call-template>, jonka attribuutti name määrittää käytettävän <xsl:template>-elementin.
Nimetyille <xsl:template>-elementeille voidaan myös välittää parametritietoja elementin <xsl:param> kautta. Kutsuissa käytetään elementtiä <xsl:with-param>.
Tarkastellaanpa esimerkkiä, jossa vaihdetaan kirjasin-parametrin oletusarvo. XML-koodille
<nimi>Timo Juonoja</nimi>
voidaan soveltaa seuraavaa XSL-säännöstöä
<xsl:template match=”nimi”>
<xsl:call-template
name=”kirjasinmaarittely”>
<xsl:with-param
name=”kirjasin”>
Verdana,
Tahoma</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name=”kirjasinmaarittely”>
<xsl:param
name=”kirjasin”>Arial</xsl:param>
<font
face=”{$kirjasin}”>
<xsl:value-of
select=”.”/>
</font>
</xsl:template>
XSL-määrittelyssä koodi select=”.” viittaa elementtiin, jota ollaan käsittelemässä (katso luku 4.1). Lisäksi kaarisulkeita {} käytetään erottamaan XSL-säännöstöä HTML-koodista. HTML-muotoinen tulos on seuraavanlainen:
<font face=”Verdana, Tahoma”>
Timo Juonoja
</font>
XML-dokumentin sisältöön kohdistuvia valintoja voidaan tehdä elementtien <xsl:if> ja <xsl:choose> avulla. <xsl:if>-elementin attribuutti test määrittää ehtolauseen.
Seuraavassa esimerkissä lause-elementin eteen sijoitetaan teksti (TÄRKEÄ), mikäli sen attribuutti tyyppi on arvoltaan tarkea. XML-koodin
<lause>Ei niin tärkeä lause.</lause>
<lause tyyppi=”tarkea”>Tärkeä lause.</lause>
käsittelevä XSL-säännöstö voisi olla seuraava:
<xsl:template match=”lause”>
<P>
<xsl:if
test=”@tyyppi=’tarkea’”>
<xsl:text>(TÄRKEÄ)
</xsl:text>
</xsl:if>
<xsl:apply-templates/>
</P>
</xsl:template>
Attribuutteihin voidaan viitata asettamalla sen nimen eteen @-merkki (katso luku 4.1). HTML-muotoinen tulos on seuraavanlainen:
<P>Ei niin tärkeä lause.</P>
<P>(TÄRKEÄ) Tärkeä lause.</P>
Elementin <xsl:choose> sisällä käytetään elementtejä <xsl:when> ja <xsl:otherwise> ohjaamaan valintoja. Elementissä <xsl:when> ehto määritellään attribuutilla test. Elementti <xsl:otherwise> ei sisällä attribuutteja ja sen sisältö valitaan, jos edelläolevien <xsl:when>-elementtien ehdoista mikään ei toteudu.
Seuraava sukupuolen mukaan erilaisen tuloksen palauttava esimerkki havainnollistaa elementin <xsl:choose> käyttöä. XML-koodin
<hlo tyyppi=”nainen”>Terhi</hlo>
<hlo tyyppi=”mies”>Timo</hlo>
<hlo>Tero</hlo>
käsittelevä XSL-säännöstö
<xsl:template match=”hlo”>
<P>
<xsl:choose>
<xsl:when
test=”@tyyppi=’nainen’”>
<xsl:text>NAINEN:
</xsl:text>
</xsl:when>
<xsl:when
test=”@tyyppi=’mies’”>
<xsl:text>MIES:
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>EI
TYYPPIÄ: </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</P>
</xsl:template>
aikaansaa HTML-muotoisen tuloksen
<P>NAINEN: Terhi</P>
<P>MIES: Timo</P>
<P>EI TYYPPIÄ: Tero</P>
Silmukkarakenne toteutetaan elementillä <xsl:for-each>. Elementti sisältää attribuutit select ja order-by. select-attribuutilla määritetään toistettava elementti. Attribuutilla order-by määritellään aakkostuksen määräävä elementti.
Seuraava esimerkki havainnollistaa elementin <xsl:for-each> käyttöä. XML-koodin
<henkilot>
<hlo>Timo Juonoja</hlo>
<hlo>Matti Muukalainen</hlo>
<hlo>Esko Esimerkki</hlo>
</henkilot>
käsittelevä XSL-säännöstö voisi olla seuraava:
<xsl:template match=”henkilot”>
<xsl:for-each
select=”henkilot” order-by=”hlo”>
<P>
<xsl:value-of
select=”.”/>
</P>
</xsl:for-each>
</xsl:template>
HTML-muotoinen tulos on seuraavanlainen:
<P>Esko Esimerkki</P>
<P>Matti Muukalainen</P>
<P>Timo Juonoja</P>
XPath-standardin avulla voidaan löytää XML-dokumentista haluttuja kohteita. XPath-kieli ei ole XML-perustainen, mutta sen syntaksi on suunniteltu sopivaksi moniin eri käyttötarkoituksiin. Luvussa tarkastellaan pääasiassa tärkeimpiä XPath-lausekkeita. Luku perustuu Neil Bradleyn kirjaan [1, luku 20]. Lisäksi liitteistä 1-4 löytyy tekstiä tukevia esimerkkejä.
XPath-lausekkeita (engl. pattern) käytetään elementtien ja attribuuttien tunnistamiseen. XPathin perussyntaksissa XML-elementtien nimet ovat peräkkäin kauttaviivalla erotettuna hakemistorakenteen tapaan (vertaa kuva 1 sivulla 1). Asteriski * vastaa mitä tahansa XML-elementtiä ja piste . viittaa käsiteltävään XML-elementtiin. Attribuutteihin voidaan viitata asettamalla sen nimen eteen @-merkki.
Tarkastellaan seuraavassa havainnollistavaa esimerkkiä, jossa kirja-elementin nimi-attribuutti (Kirja1) ja luku-elementin kappale-alielementin sisältö (Ensimmäinen kappale) sijoitetaan tulosdokumenttiin. Sovellettaessa XML-koodin
<kirja nimi=”Kirja1”>
<luku><kappale>Ensimmäinen kappale</kappale><luku>
</kirja>
XSL-säännöstöä
<xsl:template match=”kirja”>
<P>Kirjan nimi: <xsl:value-of select=”@nimi”/></P>
<HR/>
<P><xsl:value-of select=”luku/kappale”/></P>
</xsl:template>
saadaan HTML-muotoiseksi lopputulokseksi
<P>Kirjan nimi: Kirja1</P>
<HR/>
<P>Ensimmäinen kappale</P>
XPath-lausekkeelle määräytyy aina konteksti eli alkukohta XML-hierarkiassa. Seuraavassa listassa on havainnollistettuna viittaustapoja XML-puurakenteeseen:
/ dokumentin juuri,
. nykyinen kohta,
.. edellinen taso,
// mikä tahansa kohta juuresta lähtien sekä
.// mikä tahansa kohta nykyisen kohdan alapuolella.
Lausekemääritykseen voidaan lisätä lisävaatimuksia hakasulkeilla []. Hakasulkeiden avulla voidaan testata elementtien ja attribuuttien löytymistä. Hakasulkeilla voidaan myös asettaa vaatimuksia elementin tietystä arvosta tai ilmaista järjestystä, mikäli palautettavia elementtejä on useita.
Seuraavassa esimerkissä haetaan toisen kirja-elementin arvo. Tällöin XML-koodia
<kirjat>
<kirja>Kirja 1</kirja>
<kirja>Kirja 2</kirja>
</kirjat>
käsiteltäessä XSL-säännöstöllä
<xsl:template match=”kirjat”>
<P>Toisen kirja-alkion arvo:
<xsl:value-of select=”kirja[2]”/>
</P>
</xsl:template>
saadaan HTML-muotoiseksi tulokseksi
<P>Toisen kirja-alkion arvo: Kirja 2</P>
XPath-lauseke voidaan myös rajata Boolen operaattoreilla. Yleisimpiä operaattoreita ovat
and ja,
or tai,
not negaatio,
= suuruusvertailu, yhtä suuri kuin,
< suuruusvertailu, pienempi kuin,
> suuruusvertailu, suurempi kuin,
<= suuruusvertailu, pienempi tai yhtäsuuri kuin,
>= suuruusvertailu, suurempi tai yhtäsuuri kuin sekä
| unioni.
Havainnollistetaan em. operaattoreiden käyttöä muutamalla lauseke-esimerkillä. Kaikki satukirjojen nimet, joiden kirjoittajat ovat suomalaisia, voidaan hakea seuraavalla lausekkeella:
kirjat/kirja[@tyyppi=’satu’ and
tekija/kansalaisuus=’suomi’]/teoksennimi
Seuraavalla lausekkeella voidaan hakea kaikkien kirjojen sekä tekijöiden nimet:
kirjat/kirja/teoksennimi | kirjat/kirja/tekija/nimi
Nämä säännöt voisivat sopia seuraavaan XML-dokumentin osaan:
<kirjat>
<kirja tyyppi=”satu” >
<teoksennimi>Satukirja 1</teoksennimi>
<tekija>
<nimi>Timo Juonoja</nimi>
<kansalaisuus>suomi</kansalaisuus>
</tekija>
</kirja>
</kirjat>
XSL Formatting Objects (XSL:FO) sisältää yli 50 muotoiluelementtiä, joista käsitellään tässä luvussa vain tärkeimmät. Muotoilusäännöt ovat hyvin samantyyppisiä tai jopa identtisiä kuin CSS:ssä (Cascading StyleSheets). Luku pohjautuu Neil Bradleyn kirjaan [1, luku 17] sekä Reija Korhosen, Jussi Eskelisen, Ville Niemijärven ja Kai Hemmingin Rakenteiset dokumentit -kurssin seminaariesitelmään [2].
Kaikki XML-tiedoston muotoiluelementit kootaan FO-tiedostoon. FO-tiedoston juurielementti on <fo:root>. Juurielementti sisältää ainakin elementin <fo:layout-master-set> sekä mielivaltaisen määrän elementtejä <fo:page-sequence>.
Elementillä <fo:layout-master-set> määritellään sivujen yleinen ulkonäkö. Se sisältää elementtejä <fo:simple-page-master> ja <fo:page-sequence-master>.
Elementissä <fo:page-sequence> esitetään sivujen varsinainen sisältö. Attribuutilla master-name viitataan joko elementin <fo:simple-page-master> tai <fo:page-sequence-master> sivumäärittelyihin, joka määrää lopullisen ulkoasun sisällölle.
Juuri- ja sivuelementtien käyttöä havainnollistetaan seuraavassa esimerkissä:
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master
.../>
<fo:simple-page-master
.../>
</fo:layout-master-set>
<fo:page-sequence
.../>
<fo:page-sequence
.../>
</fo:root>
Elementin <fo:layout-master-set> alielementillä <fo:simple-page-master> määritellään sivujen yleinen asettelu. Jokaiselle omalle sivutyypille (esim. kansi, sisällysluettelo ja lähdeluettelo) voidaan määritellä oma asettelunsa.
Sivun korkeus ja leveys määrätään attribuuteilla page-height ja page-width. Attribuuttien auto-arvoa käytetään, kun sivun kokoa ei tiedetä. indefinite-arvoa käytetään sähköisissä sivuissa, esim. WWW-selaimessa. A4-kokoinen paperi määritellään esimerkiksi seuraavasti:
<fo:simple-page-master page-height=”29.7cm”
page-width=”21.0cm”>
Monet tulostimet osaavat tulostaa pysty- ja vaakatasoisia sivuja. Attribuutilla reference-orientation määritellään tekstin kiertokulma asteina. Kuvassa 7 havainnollistetaan tekstin kiertämistä
Kuva 7. Tekstin kiertäminen.
Esimerkiksi 90 asteen kierto tehdään seuraavasti:
<fo:simple-page-master
reference-orientation=”90”>
Tekstin lukusuunta määrätään attribuutilla writing-mode. Lukusuunta voi olla normaali vasemmalta oikealle tai vaikka heprealainen oikealta vasemmalle. Attribuutin arvo määräytyy vasemman (arvo l), oikean (r), yläosan (t) ja alaosan (b) kombinaationa. Kuitenkin pitää muistaa, että sivun yläosa määräytyy kiertokulmasta. Normaalin lukusuunnan arvoa lr-tb kiertokulman suhteen havainnollistetaan kuvassa 8.
Kuva 8. Tekstin lukusuunta arvolla lr-tb kiertokulman suhteen.
Normaali lukusuunta (arvo lr-tb) määritellään seuraavasti:
<fo:simple-page-master
writing-mode=”lr-tb”>
Sivun marginaalit määrätään elementin <fo:simple-page-master> attribuuteilla margin-left, margin-right, margin-top ja margin-bottom. Edelleen sivun yläosa määräytyy luvussa 5.2 esitellystä kiertokulmasta.
Sisältöalueelle voidaan määrätä omat marginaalit <fo:simple-page-master>-elementin alielementillä <fo:region-body>. Kuvassa 9 esitetään sekä sivun että sisältöalueen marginaalit.
Kuva 9. Sivun ja sisältöalueen marginaalit.
Sisältöalueen eli elementin <fo:region-body> marginaalit voidaan myös määritellä elementeillä <fo:region-before>, <fo:region-start>, <fo:region-end> ja <fo:region-after>. Tällä tavalla määrittelemällä sivuille voidaan lisätä esimerkiksi ylä- ja alatunnisteita. Ylä- ja alatunnisteiden lisäämistä käsitellään enemmän luvussa 5.5.
Sivun sekä sisältöalueen marginaalien määrittelyä havainnollistetaan seuraavassa esimerkissä:
<fo:simple-page-master page-height=”29.7cm”
page-width=”21.0cm” margin-top=”2cm”
margin-bottom=”2cm” margin-left=”2cm”
margin-right=”2cm”>
<fo:region-body margin-top=”2cm”
margin-bottom=”2cm” margin-left=”2cm”
margin-right=”2cm” />
</fo:simple-page-master>
Elementin
<fo:layout-master-set> (katso luku 5.1) alielementillä <fo:page-sequence-master> määritellään sivujen järjestys toisiinsa nähden (esim. kansi,
sisällysluettelo ja lähdeluettelo). Elementti sisältää alielementit <fo:single-page-master-reference>, <fo:repeatable-page-master-reference> ja <fo:
repeatable-page-master-alternatives>.
<fo:single-page-master-reference>-elementillä määritellään yksittäisen sivun paikka. Tätä elementtiä käytetään yleensä kansisivuun.
<fo:repeatable-page-master-reference>-elementillä määritellään toistuvien sivujen paikka dokumentissa, jossa parilliset ja parittomat sivut ovat ulkonäöllisesti samanlaiset.
<fo:repeatable-page-master-alternatives>-elementillä määritellään toistuvien sivusarjojen paikka dokumentissa, jossa parilliset ja parittomat sivut eroavat ulkonäöllisesti toisistaan. Elementti sisältää mielivaltaisen määrän <fo:conditional-page-master-reference>-alielementtejä.
<fo:conditional-page-master-reference>-elementti voi sisältää attribuutit page-position, odd-or-even, blank-or-not-blank. Niistä page-position-attribuutilla määritellään yksittäisen sivun paikka (ensimmäinen, viimeinen tai jokin muu), odd-or-even-attribuutilla parillisten tai parittomien sivujen asetukset ja blank-or-not-attribuutilla tyhjän sivun paikka.
Sivujen järjestyksen määrittämistä havainnollistetaan seuraavassa esimerkissä (katso myös luku 5.1):
<fo:simple-page-master master-name=”kansi” .../>
<fo:simple-page-master master-name=”runko” .../>
<fo:page-sequence-master master-name=”kirja”>
<single-page-master-reference
master-name=”kansi”/>
<single-page-master-reference
master-name=”runko”/>
</page-sequence-master>
Elementillä <fo:simple-page-master> määritellään siis sivujen marginaalit sekä elementillä <fo:page-sequence-master> ja sen alielementeillä sivujen järjestys.
Dokumentin sisältö esitetään <fo:page-sequence>-elementeissä. Elementin on esiinnyttävä ainakin kerran, mutta se voi esiintyä useastikin. Elementti sisältää alielementit <fo:static-content> ja <fo:flow>.
<fo:static-content>-elementillä voidaan lisätä ylä- ja alatunnisteita. Viittaaminen tapahtuu flow-name-attribuutilla.
<fo:flow>-elementtiin sijoitetaan dokumentin varsinainen sisältö. Elementti voi esiintyä vain kerran elementissä <fo:page-sequence>. Viittaus tapahtuu samalla tavalla kuin <fo:static-content>-elementissä flow-name-attribuutin avulla. Yleensä viittaaminen tapahtuu <fo:region-body>-elementtiin (katso luku 5.3).
Seuraavassa esimerkissä lisätään ylätunniste:
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master
master-name=”esimerkki”>
<fo:region-body
.../>
<fo:region-before .../>
<fo:region-after
.../>
<fo:region-start
.../>
<fo:region-end
.../>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence
master-name=”esimerkki”>
<fo:static-content
flow-name=”xsl-region-before”>
<fo:block>
<xsl:text>Ylätunniste</xsl:text>
</fo:block>
</fo:static-content>
</fo:page-sequence>
</fo:root>
<fo:block>-elementtiä käytetään, kun halutaan luoda kappaleita, otsikkoja tai muita tekstilohkoja. Kyseinen elementti voi sisältää tekstiä, rivinsisäisiä elementtejä tai toisia lohkoelementtejä. Tekstilohkoihin voidaan määritellä mm. marginaalit, tyhjät tilat elementin ympärille ja sisennykset attribuuttien avulla.
Lohkoja voi myös ryhmitellä elementin <fo:block-container> avulla. Ryhmitteleminen kannattaa tehdä, mikäli ryhmiteltyjen lohkojen ulkoasu (esim. marginaalit tai taustaväri) on samanlainen.
Lohkojen ryhmittely tehdään seuraavalla tavalla:
<fo:block-container>
<fo:block>Lohko
1</fo:block>
<fo:block>Lohko
2</fo:block>
<fo:block>Lohko
3</fo:block>
</fo:block-container>
Listat määritellään <fo:list-block>-elementillä. Elementti sisältää yhden tai useamman <fo:list-item>-elementin, jotka sisältävät listan alkiot. Lista-alkio muodostuu elementeistä <fo:list-item-label> ja <fo:list-item-body>. Ensimmäisellä näistä määritellään listatunnistin ja toisella lista-alkion tieto-osa.
Listoja tehdään seuraavasti:
<fo:list-block>
<fo:list-item>
<fo:list-item-label>
<fo:block>A)</fo:block>
</fo:list-item-label>
<fo:list-item-body>
<fo:block>Ensimmäinen
alkio</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
Taulukot määritellään <fo:table-and-caption>-elementillä. Sillä on alielementit <fo:table-caption> ja <fo:table>. Näistä ensimmäisellä määritellään taulukkoteksti sekä toisella itse taulukko ja sen sisältö.
<fo:table-caption>-elementin caption-side-attribuutilla voidaan määrätä taulukkotekstin paikka. Taulukkoteksti voidaan sijoittaa taulukon sisällön suhteen ylös (before; oletusarvo), alas (after), vasemmalle (start) tai oikealle (end).
Taulukon sisältö sijoitetaan <fo:table>-elementillä soluihin (cell), jotka ovat rivien
(row) sisällä. Rivit ovat puolestaan
rungon (body), ylätunnisteen (header) tai alatunnisteen (footer) sisällä. <fo:table>-elementti koostuu elementeistä <fo:table-header>, <fo:table-footer> ja <fo:table-body>.
Seuraavassa on asiaa havainnollistava esimerkki:
<fo:table-caption>Taulukkoteksti</fo:table-caption>
<fo:table>
<fo:table-header>Ylätunniste<fo:table-header>
<fo:table-footer>Alatunniste</fo:table-footer>
<fo:table-body>
<fo:table-row>
<fo:table-cell>Rivin
1 Solu 1</fo:table-cell>
<fo:table-cell>Rivin
1 Solu 2</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>Rivin
2 Solu 1</fo:table-cell>
<fo:table-cell>Rivin
2 Solu 2</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
Lisäksi elementin <fo:table> sisällä voi olla <fo:column>-elementti. Tällä elementillä voidaan määritellä sarakkeille yksityiskohtaisia määrityksiä, kuten esimerkiksi sarakkeenleveys.
Kuvat määritellään <fo:external-graphic>-elementillä. Elementin attribuutilla href määritellään kuvatiedoston URL-osoite. Kuvan koon voi määrätä attribuuteilla width ja height.
Kuvan kokoa voi myös vaihtaa skaalaamalla. Skaalaaminen tapahtuu attribuutin scale avulla. Esimerkiksi kuvan koon kaksinkertaistaminen tehdään seuraavasti:
<fo:external-graphic href=”kuva.gif” scale=”2” />
Joskus tarvitaan lohkoelementin sisällä erilaisia määrityksiä tietyille kohdille, kuten esimerkiksi sanan lihavointia. Tällaisia elementtejä kutsutaan rivinsisäisiksi elementeiksi (engl. inline objects).
<fo:inline>-elementti määrittelee <fo:block>-elementin (katso luku 5.6) haluttuun kohtaan erilaisia tekstimuotoiluja. Tekstimuotoilu voi olla esimerkiksi taustavärin asetuksia, fontin muotoilemista (kuten fonttityyppi, koko, lihavointi tai kursivointi) tai tekstin muotoilemista (kuten ylleviivattu, yliviivattu, alleviivattu, harvaan kirjoitettua tai sanavälien kasvattaminen).
Esimerkiksi
koodi
<fo:block><fo:inline
text-decoration=”underline” font-style=”italic” font-family=”Arial”
font-size=”14pt”>
Erikoista</fo:inline>tekstiä.</fo:block>
tuottaa seuraavan muotoilun
Erikoista tekstiä.
<fo:inline-container>-elementin avulla voidaan <fo:inline>-elementtejä ryhmitellä, kun halutaan monelle <fo:inline>-elementille samantyyppinen määrittely.
<fo:character>-elementin avulla muotoillaan yksittäisiä kirjaimia. Esimerkiksi veden kemiallinen kaava saadaan aikaan XSL-muotoilulla,
<fo:block>
H<fo:character character=”2” vertical-align=”sub”/>O on vesi.
</fo:block>
joka aikaansaa tuloksen
H2O on vesi.
<fo:page-number>-elementin avulla voidaan asettaa sivunumeroita. Tyypillisesti sivunumero lisätään ylä- tai alatunnisteeseen. Esimerkiksi lihavoitu sivunumero tekstin yhteyteen voidaan määritellä XSL-säännöstöllä
<fo:block>
Teksti on sivulla <fo:page-number font-weight=”bold” />.
</fo:block>
joka tuottaa tekstiin lopputuloksen
Teksti on sivulla 36.
XSL on erittäin tehokas ja monipuolinen työkalu XML-dokumenttien muuntamiseen ja muotoilemiseen. XSL jakaantuu kolmeen eri standardiin: XSLT, XPath ja XSL:FO. Näistä kaksi ensimmäistä käsittelee XML-dokumentin muuntamista ja viimeisin muotoilemista. XSLT:tä hyödyntämällä voidaan XML-dokumentteja muuntaa muihin dataformaatteihin. XPathin avulla voidaan poimia XML-dokumentista haluttuja kohteita. XSL:FO-standardia käytetään XML-dokumenttien muotoilutietojen määrittämiseen.
XSL:n ja XML:n yhteiskäytön hyvä ominaisuus on se, että yhdellä ainoalla informaation esitystavalla voidaan tuottaa tietoa monessa eri dataformaatissa. XSL:n ja varsinkin Formatting Objectsin tuettavuus on kuitenkin sovelluspuolella vielä huonoa, mutta koko ajan paranemassa. XSL:n monimutkaisuudesta johtuen on vaikea ennustaa, kuinka hyvin se tulee menestymään tulevaisuudessa.
[1] Bradley
Neil, ”The XSL Companion”, Addison Wesley, 2000.
[2] Eskelinen Jussi, Hemminki Kai, Korhonen Reija ja Niemijärvi Ville, ”XSL FO”, seminaariesitelmä, saatavilla HTML-muodossa <URL:
http://www.cc.jyu.fi/~rekorhon/xslfo/xslfo_final.htm>, Jyväskylän yliopisto, tietojenkäsittelytieteiden laitos, viitattu 20.5.2002.
[3] Tuikka Tommi, ”XSL-tyylit”, seminaariesitelmä, saatavilla HTML-muodossa <URL: http://www.cc.jyu.fi/~tommitu/opinnot/xsl/xsl.htm> Jyväskylän yliopisto, tietojenkäsittelytieteiden laitos, 28.4.2000.
[4] Heikniemi Jouni, ”Mikä on XML?”, saatavilla HTML-muodossa <URL: http://www.heikniemi.net/kirj/moxml.html>, 19.2.2001.
Liitteessä 1 on malliesimerkkinä yksinkertainen XML-tiedosto. XML-tiedoston muuntamiseen HTML-muotoon tarkoitettu XSL-tiedosto on kuvattu liitteessä 2. Kyseisten XML- ja XSL-tiedoston tuottama HTML-muotoinen tuloste on esitetty liitteessä 3. Liitteessä 4 on DTD-määrittely XML-elementeille.
<!-- XML-määrittely -->
<?xml version="1.0"
encoding="ISO-8859-1"
standalone="no"?>
<!-- XSL-tyylipohjan määrittely (katso luku 3.2). -->
<?xml-stylesheet
href="testi.xsl" type="text/xsl"?>
<!-- DTD-määrittely -->
<!DOCTYPE testi SYSTEM
"testi.dtd">
<!-- XML-tiedoston elementit ja niiden sisältö. -->
<testi otsikko="XSL-testi" xml:lang="fi">
<yleiset>
<tekija>
<nimi>Timo Juonoja</nimi>
<email>tijuonoj@cc.jyu.fi</email>
</tekija>
<teos>XSL-testi</teos>
</yleiset>
<kappale tunniste="johdanto">
<otsikko>Johdanto</otsikko>
<teksti>
Tämän kappaleen nimi on johdanto.
</teksti>
</kappale>
<kappale tunniste="yhteenveto">
<otsikko>Yhteenveto</otsikko>
<teksti>
Tämän kappaleen nimi on yhteenveto.
</teksti>
</kappale>
</testi>
<!-- XML-määrittely -->
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Nimiavaruuden määrittely (katso luku 3.1). -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Tulosdokumentti HTML-muotoon (katso luku 3.8). -->
<xsl:output method="html" indent="yes"
encoding="iso-8859-1"/>
<!-- Template-sääntö elementille testi
(katso luku 3.4). -->
<xsl:template match="testi">
<html><head>
<!-- Otsikkokenttä value-of –elementin avulla
(katso luvut 3.7 ja 4.1). -->
<title><xsl:value-of select="@otsikko"/></title>
</head>
<body>
<!-- Yleiset tiedot yleiset-elementistä
(katso luku 3.5). -->
<xsl:apply-templates select="yleiset"/>
<hr/>
<h3>Sisältö:</h3>
<ul>
<!-- Sisältö listana (katso luku 3.5). -->
<xsl:apply-templates select="kappale/otsikko"/>
</ul><br/>
<!-- Kappaleet (johdanto ja yhteenveto)
(katso luku 3.5). -->
<xsl:apply-templates select="kappale"/>
</body>
</html>
</xsl:template>
<!-- Template-sääntö elementille yleiset
(katso luku 3.4). -->
<xsl:template match="yleiset">
<b>Sivun tekijä: </b>
<!-- Sivun tekijän haku nimi-elementistä
(katso luku 3.7). -->
<xsl:value-of select="tekija/nimi"/>
<!-- Sähköpostiosoite email-elementistä
(katso luvut 3.14 ja 4.1). -->
(<a href="mailto:{tekija/email}">
<xsl:value-of select="tekija/email"/></a>)<br/>
<!-- Teoksen nimi teos-elementistä
(katso luku 3.7). -->
<b>Teos: </b>
<xsl:value-of select="teos"/><br/>
</xsl:template>
<!-- Template-sääntö elementille otsikko
(katso luku 3.4). -->
<xsl:template match="kappale/otsikko">
<!-- Numerointielementin otsikko eteen number-
elementin avulla (katso luku 3.12). -->
<xsl:number count="kappale"/><xsl:text> </xsl:text>
<!-- Linkki kappaleeseen tunniste-attribuutin
avulla, # on HTML-koodia (katso luku 4.1) -->
<a href="#{../@tunniste}">
<xsl:apply-templates/></a><br/>
</xsl:template>
<!-- Template-sääntö elementille kappale
(katso luku 3.4). -->
<xsl:template match="kappale">
<!-- Linkkimäärityksellä sisällyksestä päästään
oikeaan kappaleeseen (katso luku 4.1). -->
<a
name="#{@tunniste}"></a>
<xsl:number/><xsl:text> </xsl:text>
<!-- Otsikko vahvennettuna (katso luku 3.7). -->
<b><xsl:value-of select="otsikko"/></b>
<p>
<!-- Kappaleen teksti (katso luku 3.7).-->
<xsl:value-of select="teksti"/>
</p><br/>
</xsl:template>
</xsl:stylesheet>
Sivun tekijä: Timo
Juonoja (tijuonoj@cc.jyu.fi)
Teos: XSL-testi
Sisältö:
1 Johdanto
2 Yhteenveto
Tämän kappaleen nimi on johdanto.
Tämän kappaleen nimi on yhteenveto.
<!-- DTD-määrittely XML-elementeille ja niiden
suhteille. Näitä asioita ei käydä läpi
tutkielmassa. -->
<!ENTITY yliopisto "Jyvaskylan yliopisto
<!ENTITY laitos "Informaatioteknologian tiedekunta">
<!ELEMENT testi (tekija, teos, kappale)>
<!ATTLIST
testi otsikko CDATA #REQUIRED
xml:lang CDATA #REQUIRED>
<!ELEMENT yleiset (tekija,teos)>
<!ELEMENT tekija (nimi, email)>
<!ELEMENT nimi (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT teos (#PCDATA)>
<!ELEMENT kappale (otsikko, teksti)>
<!ATTLIST kappale tunniste CDATA #REQUIRED>
<!ELEMENT otsikko (#PCDATA)>
<!ELEMENT teksti (#PCDATA)>