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.


Esipuhe

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.


Termiluettelo

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äl

1      Johdanto.. 1

2      XSL:n toimintaperiaate.. 3

2.1       XML-määrittelykieli 3

2.2       XSL-prosessi 4

2.3       XSL-muunnos (XSLT) 4

2.4       XSL-muotoilu (XSL:FO) 5

2.5       Ilmaisukieli XPath.. 6

2.6       XSL, XSLT ja XPath yhdessä.. 7

2.7       XSL- ja XSLT-prosessorit. 7

3      XSL-muunnos. 8

3.1       Nimiavaruudet. 8

3.2       XSL-tyylipohja.. 8

3.3       Tyylipohjan jakaminen useaan tiedostoon.. 10

3.4       Muunnossääntöjen määrittäminen.. 10

3.5       Lapsielementit ja niiden käsittely.. 11

3.6       Elementtien korvaaminen.. 11

3.7       Elementtien sisällön käsittely.. 12

3.8       HTML-tuloste. 12

3.9       XML-tuloste. 13

3.10     Muiden sisältötyyppien luonti 14

3.11     Lajittelu.. 14

3.12     Numerointi 16

3.13     Muuttujat. 17

3.14     Nimetyt template-elementit. 17

3.15     Ehtolauseet. 19

3.16     Silmukat. 21

4      Kohteiden poimiminen XPathin avulla.. 22

4.1       XPath-lausekkeet. 22

4.2       XPath-lausekkeen konteksti XML-hierarkiassa.. 23

4.3       XPath-lausekkeen lisämäärityksiä.. 23

4.4       Boolen operaattorit. 24

5      XSL-muotoilu.. 26

5.1       Juurielementti ja sivuelementit. 26

5.2       Sivujen asettelu.. 27

5.3       Sivun marginaalit. 28

5.4       Sivujen järjestys. 30

5.5       Sisältö.. 31

5.6       Tekstilohkot. 32

5.7       Listat. 33

5.8       Taulukot. 34

5.9       Kuvat. 35

5.10     Rivinsisäiset elementit. 35

5.11     Yksittäisten kirjainten muotoilu.. 36

5.12     Sivunumerointi 36

6      Yhteenveto.. 37

Lähteet.. 38

Liitteet.. 39

Liite 1: Esimerkki XML-tiedostosta.. 39

Liite 2: Esimerkki XSL-muunnostiedostosta.. 41

Liite 3: XML-tiedoston HTML-muotoinen tuloste. 44

Liite 4: Esimerkki DTD-tiedostosta.. 45

 


 


1         Johdanto

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.

2         XSL:n toimintaperiaate

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].

2.1        XML-määrittelykieli

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.


2.2        XSL-prosessi

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.

2.3        XSL-muunnos (XSLT)

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.

2.4        XSL-muotoilu (XSL:FO)

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.

2.5        Ilmaisukieli XPath

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.


2.6        XSL, XSLT ja XPath yhdessä

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>

2.7        XSL- ja XSLT-prosessorit

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.

3         XSL-muunnos

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ä.

3.1        Nimiavaruudet

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”>

3.2        XSL-tyylipohja

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.

3.3        Tyylipohjan jakaminen useaan tiedostoon

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ä.

3.4        Muunnossääntöjen määrittäminen

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>

3.5        Lapsielementit ja niiden käsittely

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>

3.6        Elementtien korvaaminen

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>

3.7        Elementtien sisällön käsittely

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

3.8        HTML-tuloste

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” />

3.9        XML-tuloste

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”?>

3.10   Muiden sisältötyyppien luonti

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-->

3.11   Lajittelu

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>

3.12   Numerointi

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>

3.13   Muuttujat

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>

3.14   Nimetyt template-elementit

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>

3.15   Ehtolauseet

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>

3.16   Silmukat

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>

4         Kohteiden poimiminen XPathin avulla

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ä.

4.1        XPath-lausekkeet

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>

4.2        XPath-lausekkeen konteksti XML-hierarkiassa

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.

4.3        XPath-lausekkeen lisämäärityksiä

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>

4.4        Boolen operaattorit

XPath-lauseke voidaan myös rajata Boolen operaattoreilla. Yleisimpiä operaattoreita ovat

and         ja,

or            tai,

not         negaatio,

=              suuruusvertailu, yhtä suuri kuin,

&lt;       suuruusvertailu, pienempi kuin,

&gt;       suuruusvertailu, suurempi kuin,

&lt;=    suuruusvertailu, pienempi tai yhtäsuuri kuin,

&gt;=    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>

5         XSL-muotoilu

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].

5.1        Juurielementti ja sivuelementit

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>

5.2        Sivujen asettelu

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”>

5.3        Sivun marginaalit

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>

5.4        Sivujen järjestys

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.

5.5        Sisältö

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>

5.6        Tekstilohkot

<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>

5.7        Listat

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>


5.8        Taulukot

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.

5.9        Kuvat

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” />

5.10   Rivinsisäiset elementit

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.

5.11   Yksittäisten kirjainten muotoilu

<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.

5.12   Sivunumerointi

<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.

6         Yhteenveto

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.

Lähteet

[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.

Liitteet

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.

Liite 1: Esimerkki XML-tiedostosta

<!-- 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>


Liite 2: Esimerkki XSL-muunnostiedostosta

<!-- 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>


Liite 3: XML-tiedoston HTML-muotoinen tuloste

Sivun tekijä: Timo Juonoja (tijuonoj@cc.jyu.fi)
Teos: XSL-testi


Sisältö:

1 Johdanto
2 Yhteenveto


1 Johdanto

Tämän kappaleen nimi on johdanto.


2 Yhteenveto

Tämän kappaleen nimi on yhteenveto.


Liite 4: Esimerkki DTD-tiedostosta

<!-- 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)>