W3C Suomen toimisto

Etusivu / Koulutus

XML-peruskurssi

KOULUTUSMATERIAALI 20.2.2003
Ossi Nykänen (ossi@w3.org)
W3C Suomen toimisto

Tiivistelmä. XML-peruskurssi esittelee XML:n perusidean, luonnehtii yksinkertaisia XML-sovelluksia, käy läpi XML-merkkauksen, esittelee dokumentin tyyppimäärittelyn ja XML-nimiavaruudet, sekä pohjustaa XSL-muunnosten opiskelua. Koulutusmateriaali ei pyri määrittelemään XML:ää vaan yrittää kertoa siitä. Kurssin lähestymistapa aiheeseen on luonteeltaan tekninen.

Tämä XML-peruskurssi löytyy verkosta (kalvosarjan tapaisiin osiin jaettuna) osoitteesta http://www.w3c.tut.fi/ training/2003/0219-xml-1/index.html. Kurssimateriaalin lineaarinen versio löytyy osoitteesta http://www.w3c.tut.fi/ training/2003/0219-xml-1/single.html (tulostettuna ei sisällä aivan kaikkia esimerkkejä.)

Kurssin asiasisältöä on viimeksi päivitetty 3.3.2003 (ON). Pikkuvirheitä on korjattu 7.4.2003 (ON).

1. Esipuhe

XML on tapa merkata tekstidokumentteja. XML on metakieli. XML on tapa integroida tietoa ja sovelluksia. XML on eri merkkauskielten, Semanttisen Webin ja saavutettavuuden selkäranka. XML tarjoaa yhtenäisen rajapinnan kaikkeen tietoon. XML on tekninen kehys yhteensopivien ja hyvien teknisten ratkaisujen tekemiseen. XML on universaali tapa käsitellä tietoa.

XML-peruskurssin tarkoituksena on kertoa mistä XML:ssä oikeastaan on kyse.

Sisällysluettelo

1. Esipuhe
2. Johdanto
3. XML-sovelluksia
4. XML-merkkaus
5. Dokumenttien looginen ja fyysinen rakenne
6. Nimiavaruudet
7. XML ja tyylit
8. Yhteenveto

1. 1 Mistä XML:ssä oikein on kyse?

XML is the ASCII of the 21st century
--Tim Bray

...ja vähän enemmänkin.

XML-peruskurssin verkkoaineistoa saa vapaasti käyttää sellaisenaan ja kokonaisuudessaan. Aineistoon voi kohdistaa linkkejä omasta aineistostaan (esim. verkkosivuilta) hyvien tapojen mukaisesti. XML-peruskurssin aineiston kaikenlainen muuntelu, yhdistely tai kopioiminen osittain tai myyminen on kuitenkin ehdottomasti kiellettyä. W3C Suomen toimisto ei vastaa mahdollisista virheistä. Mikäli käytät XML-peruskurssia osana opetustasi, ilmoita siitä osoitteeseen w3c@cs.tut.fi. (Erillinen ilmoitus jokaisesta pidetystä opintojaksosta tai kurssista.)

Kaikki palaute peruskurssien kehittämiseksi on tervetullutta. Palautetta voi myös lähettää osoitteella w3c@cs.tut.fi.

1. 2 XML-peruskurssin laajuus ja toteutus

XML-peruskurssilla tutustutaan esimerkkien kautta XML:n perusteisiin ja kuvailevan merkkauksen ideaan. Kurssilla tarkastellaan yksinkertaisia XML-sovelluksia, opitaan XML-merkkaus, käydään läpi dokumenttien tyyppimäärittelyn ja nimiavaruuksien perusteet ja tarkastellaan XSL-tyylejä "ensimmäisenä opittavana uutena ja hyödyllisenä XML-sovelluksena". Perustietoina oletetaan tietotekniikan perustiedot ja auttava HTML:n tuntemus.

Kurssilla ei niinkään syvennytä yksittäisten XML-ohjelmistojen käyttöön, vaan tarkastellaan XML:ää yleisenä menetelmänä. Esimerkkeinä käytetään lähinnä ilmaisohjelmia ja tavalla tai toisella visuaalisia sovelluksia (koska niiden kautta asiaan pääse helpoimmin sisälle). Merkkauksen oppimismielessä dokumentit kirjoitetaan "käsin". Laajamittaisessa tuotantokäytössä esim. XML:n tekninen kirjoittaminen lienee kuitenkin soveliasta integroida osaksi jonkin tietyn dokumenttien hallintajärjestelmän käyttöä. Tämäkään ei ole kaikissa sovelluksissa tarpeen; huomattava osa XML-tekstistä on puhtaasti ohjelmien tuottamaa.

Kurssin onnistuminen perustuu pitkälti opiskelijan omaan aktiivisuuteen. Oppimisen kannalta ensiarvoisen tärkeää on esitettyjen asioiden kokeileminen ja tehtävien oma-aloitteiden ja huolellinen tekeminen. Tie todelliseen osaaminen syntyy siitä kun yrittää suhteuttaa ja soveltaa oppimaansa omassa työssään tai harrastuksessaan. XML-peruskurssi ei missään tapauksessa käy läpi "koko XML:ää" (ei edes XML 1.0 -suositusta). Kurssisisältö on valittu ja rajattu laajuuteensa allekirjoittaneen opetuksesta ja sovellusten parissa työskentelystä saatujen kokemusten perusteella. Selkeimmin "poisjätetty" asia on XML-sovellusten ohjelmointi esim. DOM-rajapintaa käyttämällä.

Tunneiksi muutettuna XML-peruskurssi on suunniteltu vastaamaan n. yhden päivin mittaista varsin tiivistä koulutuskokonaisuutta. Sisällön omaksuminen edellyttää käytännössä asiaa selventävien lisäesimerkkien ja osallistujien kysymysten käsittelyä koulutuksen osana. Osallistujien valmiuksien mukaisesti tuntimäärää voidaan kuitenkin tästä supistaa (tai asiasisältöä laajentaa). Kurssia ei ole ensisijaisesti tarkoitettu itseopiskeluun, joskin sitä voi käyttää myös sellaiseen. Kurssimateriaali sijoittuu narrattiivisen tekstin ja esityskalvojen välimaastoon. Tarkastelun tarkkuus ja esitystapa ovat teknisen kohdeyleisön löyhän rajauksen takia varsin "käytännönläheisiä" (sikäli kun tietokonekieliin liittyvät asiat nyt voivat käytännönläheisiä olla).

Lopuksi on syytä todeta, että XML-peruskurssi on pohjimmiltaan pienten mutta tärkeiden teknisten yksityiskohtien parissa työskentelyä. Tarkoituksena on nyt ensisijaisesti oppia peruskäsitteiden käytön ohella merkkaamaan XML-dokumentteja ja saada tuntumaa XML-sovelluksiin. Tuotantokäytössä XML-merkkaus on kuitenkin lähes poikkeuksetta "vain" tapa koodata tietorakenteita (keino ns. sarjallistaa tietoa) -- tällöin suunnittelukäsitteet asetetaan dokumenttien loogisen rakenteen ja erilaisten rajapintojen tasolle (muuten yksityiskohdat vievät päähuomion itse asian tekemiseltä). Toki yksityiskohtienkin täytyy tällöinkin olla hallussa.

XML-peruskurssin tavoitteena on yleiskatsaus XML-perusteisiin ja merkkauksen opettelu. Edistyneempi XML-osaaminen edellyttää myös sen sovellusten tuntemusta.

2. Johdanto

Kaiken tietojenkäsittelyn perusta on sopimus tekstimuotoisen tiedon esittämisestä. XML eli Extensible Markup Language on sekä konkreettinen menetelmä rakenteisten dokumenttien kirjoittamiseen (ja merkkaamiseen) että metakieli, jonka avulla voidaan määritellä merkkauskieliä. XML mahdollistaa myös valitun merkkauskielten laajentamisen ja eri merkkauskielten yhdistämisen (jos ko. merkkauskielten sovellusten suunnittelu sen sallii).

2. 1 XML on metakieli?

XML-kielen spesifikaatiot ja XML:n avulla määritellyt merkkauskielet (joita voidaan kutsua myös XML-sovelluksiksi) muodostavat pinomaisen määrittelyrakenteen:

XHTML SVG ...
XML XML NS XML Schema
Unicode URI

Metakielellä tarkoitetaan tässä yhteydessä kieltä joka tarjoaa perustan (perusmerkistön ja merkkauskieliopin) sovelluskohtaisten, "konkreettisten" kielten määrittelemiseksi. Konkreettisen kielen tärkeimmät osat ovat sanasto ja sen käyttöä ohjaava kielioppi.

2. 2 Merkkaus

Tekstin merkkaamisella tarkoitetaan tässä yhteydessä sitä että tekstin sekaan liitetään tekstiä kuvailevaa informaatiota. Esimerkiksi

Kuulakisan kolme parasta 21.6.2002 olivat:

     Tuula 8,1
     Maija 7,2
     Liisa 7

...voidaan tulkitsemisen helpottamiseksi kirjoittaa muodossa:

<ilmoitus xml:lang="fi">
<otsikko>
Kuulakisan kolme parasta <pvm>21.6.2002</pvm> olivat:
</otsikko>
  <tulokset>
    <nimi>Tuula</nimi> <tulos yksikkö="metri">8,1</tulos>
    <nimi>Maija</nimi> <tulos yksikkö="metri">7,2</tulos>
    <nimi>Liisa</nimi> <tulos yksikkö="metri">7</tulos>
  </tulokset>
</ilmoitus>           

Esimerkissä merkkaus paitsi jäsensi tekstin koneellisesti luettavissa olevaan muotoon (tekstin eri osien erottelu), myös lisäsi informaatiota tekstin sekaan (teksti on kirjoitettu suomen kielellä ja pituuden yksikkö on "metri"). Ihminen saattaisi arvata em. lisätiedot oikein mutta tietokone ei -- merkkaus esittää tämän tiedon täsmällisesti (elementit ja attribuutit). (Kun esimerkkiin vielä lisätään tieto käytetystä merkistöstä ja merkkikoodauksesta, on kaikki tarvittava tieto saatavilla.)

Merkkaaminen suoritetaan poikkeuksetta tietojenkäsittelyn ja "tietokoneiden" näkökulmasta.

2. 3 Merkkaukielioppi ja sanasto

Merkkauskieliin liittyy keskeisesti kaksi peruskäsitettä: kielioppi ja sanasto. Edellisessä esimerkissä XML:n merkkauskielioppi määrittelee säännöt joiden ansiosta tekstisisältö ja sitä kuvaileva merkkaus ei koskaan mene sekaisin (esim. <nimi> merkkaa nimi-tyyppisen tekstilohkon alkukohdan ja </nimi> sen loppukohdan -- kokonaisuus, jota XML-terminologiassa kutsutaan elementiksi). Merkkauskielioppi on kaikille XML-sovelluksille yhteinen.

Merkkauksessa käytetty sanasto sen sijaan on sovelluskohtainen. Sanasto sisältää kaikki merkkauksessa käytetyt nimet (edellisessä esimerkissä nimet ilmoitus, xml:lang, otsikko, pvm, tulokset, nimi ja tulos). Sanaston käyttöä rajoittaa sanaston kielioppi jonka määrittelemiseen XML:stä löytyy lisävälineistöä. Sanaston tulkinnan (mitä yksittäiset sanat loppujen lopuksi tarkoittavat tai miten niiden välittämä informaatio pitää prosessoida) asettamiseen tarvitaan vielä erillinen, sovelluskohtainen sopimus, esim. suomen kielellä kirjoitettu määrittelydokumentti.

XML on kehitetty SGML-kielen pohjalta (Standard Generalized Markup Language). XML:ää voi kuitenkin mainiosti soveltaa ilman minkäänlaista SGML-tuntemusta.

Merkkauskielioppi on kaikille XML-sovelluksille yksi ja sama. Kukin sovellus määrittelee oman sanastonsa (tai yhdistelee useita sanastoja).

2. 4 XML-prosessori vs. XML-sovellus

Kielioppien ja sanaston erottelu on tärkeä rajanveto XML:ssä. XML-prosessorin tehtävä on lukea ja jäsentää XML-dokumentti sekä tarkistaa sen kielioppi. Sovellus puolestaa tulkitsee tämän tiedon ja esim. näyttää "lähdedokumenttia" vastaavan WWW-sivun:

XML-prosessori
lähdedokumentti
jäsennys
standardi rajapinta
XML-sovellus
käyttö

XML:n suuri merkitys tietojenkäsittelyssä perustuu siihen, että se tarjoaa yhtenäisen perustan erilaisten tietorakenteiden käsittelyyn ja tallentamiseen tekstimuotoisena -- yksi ja sama XML-prosessori periaatteessa riittää kaikkien sovellusten tarpeisiin. Käytännössä XML luo tekniset edellytykset erityyppisten sovellusten yhteensopivuudelle ja vähentää samalla turhaa työtä.

Eräs XML:n käyttökelpoisuuden syistä on selkeän työnjaon osoittaminen erilaisten tietojenkäsittelytehtävien välillä. XML-prosessorin ja XML-sovelluksen erottaminen toisistaan on tästä hyvä esimerkki.

2. 5 XML-perhe

Merkkaus on hyvä tietojenkäsittelyn lähtökohta, mutta yksin merkkauksella ei vielä pitkälle pötkitä. XML on kokonainen perhe tekniikoita joista tällä XML-peruskurssilla käsitellään vain pientä osaa. XML-perhe tarjoaa välineitä mm.

Näiden perusratkaisujen varaan voidaan edelleen rakentaa esim. hypertekstin, vektorigrafiikan ja matematiikan merkkauskieliä (HTML, SVG ja MathML), rakentaa toisen sukupolven Semanttinen Web (RDF-perhe, OWL), laatia suosituksia dokumenttien salauksen ja kryptauksen suorittamiseen (XML Signature, XML Encryption), standardoida hajautettujen ohjelmistojen välistä viestiliikennettä (SOAP ja WSDL), sekä koota välineistöä monikanavajulkaisemisen tarpeisiin (Style, CC/PP, VoiceXML). Uusia XML-sovelluksia voi kehittää kuka tahansa. Sovellusten tekemiseen liittyy yleensä myös dokumentointi- ja ohjelmointityötä (esim. hypertekstin merkkauskielestä ei olisi hyötyä ellei olisi sitä noudattavia selain- ja palvelinohjelmia).

Kaikkien XML:ää hyödyntävien ei tarvitse osata teknistä XML:ää. Sovelluksissa XML piiloutuu käyttöliittymien ja tiedostojärjestelmien suunnitteluratkaisujen taakse, eikä ns. loppukäyttäjä esim. XML-merkkausta juurikaan tule lukemaan; useimmat meistä käyttävätkin jatkuvasti esim. SMTP- ja HTTP-protokollien (sähköposti ja WWW-hyperteksti) varaan rakennettuja sovelluksia näiden tekniikkaa juuri ajattelematta.

Sovelluskehittäjät, tekniset kirjoittajat ja tietoteknisten välineiden suunnittelijat todennäköisesti kuitenkin tarvitsevat XML:ää omassa työssään. XML:ää voi kuitenkin hyvin soveltaa ilman koko XML-perheen tuntemusta: useimmille riittää perusteiden tuntemus joka luo perustan uuden oppimiselle. Tämä on XML-peruskurssin tavoite.

XML on kokonainen perhe standardinomaisia teknologioita. XML-merkkaus on vain jäävuoren huippu.

2. 6 XML, W3C ja XML-spesifikaatiot

XML-perhe on joukko W3C-suosituksia. Käytännössä XML:n määrittävät spesifikaatiot ovat W3C:n kehittämiä, julkisia, yksityiskohtaisia ja täsmällisiä, englannin kielisiä kuvauksia joiden varassa XML-yhteensopivien tietokoneohjelmistojen tarkka toteuttaminen on mahdollista. Erityisesti tämä tarkoittaa sitä että jos ja kun haluaa tietää mitä se-ja-se XML-suositus tarkkaan ottaen sisältää, ainoa virallinen tietolähde on ko. tekninen suositus itse.

Koulutusmateriaalit ja kirjat tiivistävät XML-spesifikaatioiden tietoa ja kytkevät sen sovelluksiin; ne eivät kuitenkaan koskaan riitä tyhjentävästi selittämään (ts. korvaamaan) varsinaisia teknisiä spesifikaatioita. Koulutusmateriaalia kuitenkin tarvitaan, koska tekniset suositukset ovat yleensä (useista syistä johtuen) vaikeampilukuisia kuin asioista "epämääräisemmin" tai "esimerkkien kautta" kertovat johdannot.

World Wide Web Consortium (W3C) kehittää yhteisiä ja yhteensopivia Webin pelisääntöjä ja teknologioita (spesifikaatioita, ohjeita, ohjelmistoja sekä työkaluja). Työn tavoitteena on ohjata Webin kehittymistä täyteen mittaansa tiedonvälityksen, kaupankäynnin, kommunikaation ja yhteisymmärryksen foorumina. W3C ja W3C Suomen toimisto eivät siis ole koulutusorganisaatioita, vaan pikemminkin "standardointiorganisaatioita". W3C asettaa (teknisiä) suosituksia ja W3C-aluetoimistot tukevat W3C:n työtä ja suositusten tunnetuksi tekemistä. Tässä nimenomaisessa asiayhteydessä W3C Suomen toimisto tukee XML-työn edistämistä koulutustyöllä; tarjoamalla kurssimuotoisen, kevyen johdannon XML-maailmaan.

W3C Suomen toimiston XML-peruskurssiinkaan ei kuitenkaan tule suhtautua "normatiivisenä" XML-lähteenä, ts. kurssi ei pyri määrittelemään XML:ää, vaan kertoo siitä. Kurssimateriaali voi eri syistä johtuen sisältää myös epätäsmällistä tai suorastaan virheellistä tietoa (kaikki havaitut virheet tietenkin korjataan parhaan mukaan). Missään tapauksessa kyse ei ole W3C:n "ainoasta sertifioimasta XML-kurssista" (tällaista käytäntöä W3C:llä ei edes ole).

XML-peruskurssin virallisia lähteitä ovat W3C-suositukset, erityisesti:

Kaikki W3C-suositukset löytyvät W3C Suomen toimiston sivuilta kohdasta W3C-suositukset. Kaikki W3C:n julkaisemat spesifikaatiot löytyvät W3C:n kotisivuilta kohdasta W3C Technical Reports and Publications. Helppolukuinen johdannon W3C:hen ja sen toimintaan tarjoaa esim. W3C Pähkinänkuoressa.

W3C:n XML-spesifikaatiot ovat ainoa virallinen XML:n määrittelevä lähde. Koulutusmateriaali ja kirjallisuus on suunniteltu välittämään tätä tietoutta havainnollisesti erilaisten sovellusten yhteydessä.

2. 7 Tehtäviä

Merkkaus, keskustelua:

  1. Missä yhteyksissä olet kuullut XML:stä? (Mitä kaikkea sen on luvattu ratkaisevan? ;-)
  2. Mitä muita tiedon kuvailutapoja tunnet? Miten ne mielestäsi eroavat XML:stä?
  3. Miten SGML-tausta näkyy XML-merkkauksessa?
  4. Miksi XML-prosessori ja XML-sovellus kannattaa teknisesti erottaa toisistaan?
  5. Kuka omistaa XML-suositukset (esim. merkkauskieliopin määrittelyn)? Onko asialla merkitystä?

3. XML-sovelluksia

Suurin osa XML:n käyttöä liittyy XML:ään jonkin tietyn sovelluksen osana. Seuraavaksi luodaan yleiskatsaus kolmeen erityyppiseen XML-sovellukseen, HTML, SVG ja SOAP. Kukin esimerkki pyrkii havainnollistamaan jotakin tiettyä XML:n piirrettä. Luettelo ei missään tapauksessa ole kattava lista XML-sovelluksia! (Lisää linkkejä sovelluksiin löytyy esim. XML-kotisivuilta.)

3. 1 Mihin XML:ää voi soveltaa?

XML on lähes täysin sovellusriippumaton teknologia. XML:ää voidaan käyttää ilman ajatusta "dokumentin katselemisesta" (esim. tietokoneohjelman konfigurointitiedosto tai XML-viesti) tai edes "tekstitiedostoon tallettamisesta" (abstraktin tietorakenteen käsittely DOM-rajapinnalla).

3. 2 Extensible HyperText Markup Language -- XHTML

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Anteron kotisivu</title>
  </head>
  <body>
    <h1>Moi maailma!</h1> 
    <p>Sivu noudattaa 
    <a href="http://www.w3.org">W3C</a>-suosituksia.</p>
  </body>
</html>

W3C-suosituksen mukainen WWW-sivu on XHTML-tyyppinen XML-dokumentti.

3. 3 Scalable Vector Graphics -- SVG

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <ellipse cx="600" cy="200" rx="550" ry="175" 
           fill="yellow" stroke="blue" stroke-width="20"/>
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2" />
  <polygon fill="red" stroke="blue" stroke-width="10" 
            points="350,75  379,161 469,161 397,215
                    423,301 350,250 277,301 303,215
                    231,161 321,161" />
  <polygon fill="lime" stroke="blue" stroke-width="10" 
            points="850,75  958,137.5 958,262.5
                    850,325 742,262.6 742,137.5" />
  <text x="470" y="240" font-size="70">Tekstiä</text>  
</svg>

W3C-suosituksen mukainen SVG-kuva on SVG-tyyppinen XML-dokumentti (tai dokumentin osa).

3. 4 Simple Object Access Protocol -- SOAP

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
       <m:GetLastTradePrice xmlns:m="http://example.org/trade">
           <m:id>DIS</m:id>
       </m:GetLastTradePrice>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

XML:n käyttöön ei tarvitse liittyä ajatusta "dokumentista joka luetaan" -- kyse voi olla myös "viestistä" tai "tietorakenteesta".

3. 5 Tehtäviä

XML-sovellukset, keskustelua:

  1. Mitä XML-sovelluksia tunnet jo entuudestaan?
  2. XML-merkkaus näyttää aluksi sotkuiselta(?) -- onko tällä merkitystä?
  3. Mistä esim. HTML:n osaamisessa loppujen lopuksi on kyse? (vinkki: merkkauskielioppi - sanasto - sanaston kielioppi - tulkinta sovelluksessa + muu tarvittava tietämys)
  4. Mitä tarkoittaa modulaarinen HTML? (vinkki: XHTML™ 1.1)

Tieto dokumentin tyypistä on edellytys sen tulkitsemiselle -- mekaaninen keino tarkistaa dokumentin tyyppi on validoida dokumentti:

  1. Talleta edellä esitetty XHTML-esimerkkidokumentti tiedostoon esim.html ja validoi se W3C:n validaattoripalvelun avulla.
  2. Tee dokumenttiin harkittu virhe (mikä tahansa ;-). Kokeile validoida dokumentti uudestaan. Minkälaisia virheitä validaattori voi periaatteessa tunnistaa? (vrt. esim. saavutettavuuskysymykset, WAI)
  3. Miksi on tärkeää että esim. HTML-koodi on aina validia?

XML-sovellukset yleisesti:

  1. Kaikki selaimet eivät (vielä) osaa tulkita SVG-dokumentteja. Onko kaikki XML-sovellukset tarkoitettu WWW-selaimiin integroitavaksi?
  2. Miltä XML-dokumentti "näyttää"? -- onko kysymys järkevä? (vinkki: VoiceXML...)
  3. Riittääkö käytännön sovelluksissa yksin XML-merkkauksen osaaminen? Mitä muuta tarvitaan?

4. XML-merkkaus

XML:n perusta on XML 1.0 -suosituksen määrittelemä merkkauskielioppi. Merkkauskielioppi ensisijaisesti jakaa XML-dokumentin tekstisisällön kahteen osaan: merkkaukseen ja merkkidataan:

<osoite kaupunki="Tampere">    <!-- merkkausta  -->
  Puistokatu 102               <!-- merkkidataa --> 
</osoite>                      <!-- merkkausta  -->

Muistutetaan vielä, että XML-merkkauskielioppi ei määrittele sanastoa (ts. nimiä joita merkkauksessa käytetään). Sanasto määritellään (paria poikkeusta lukuun ottamatta) sovelluskohtaisesti (vrt. esim. XML:n varassa määritely XHTML-sovellus).

4. 1 Minkälaista merkkausta XML-dokumentti voi sisältää?

XML-dokumentin merkkaus on jotakin seuraavista

Näitä tarkastellaan seuraavaksi yksityiskohtaisemmin.

Todettakoon että kaikkia merkkausrakenteita ei XML-peruskurssilla käydä yksityiskohtaisesti läpi. Käytännössä perusmerkkausta täydennetään vielä nimiavaruuksiin liittyvällä merkkauskieliopilla (tämä on määritelty W3C-suosituksessa Namespaces in XML). Tähän palataan myöhemmin.

4. 2 XML-dokumentin yleisrakenne

   1. XML-dokumentti
       1.1 dokumentin esittelyosa
         1.1.1 valinnainen XML-julistus (merkistö!)
   <?xml version="1.0" encoding="iso-8859-1"?>   
         1.1.2 valinnainen dokumentin
               tyyppijulistus (sisältäen
               tyyppimäärityksen)
   
   <!DOCTYPE esimerkki [ 
     <!ELEMENT esimerkki (tervehdys)>  
     <!ATTLIST esimerkki kuvaus CDATA #IMPLIED>
     <!ELEMENT tervehdys (#PCDATA)>
   ]>
       1.2 dokumentin esiintymäosa                  
         1.2.1 juurielementti ja sen
             sisältö
   <esimerkki kuvaus="pakollinen">           
     <tervehdys>Hei maailma!</tervehdys>  
   </esimerkki>

XML-merkkauksen perusta on hierakkinen elementtirakenne. Attribuutit liittyvät elementtien alkutagiin (tai tyhjän elementin tagiin). Dokumentin tekstisisällön käsittävä esiintymäosa on XML-dokumentin ainoa pakollinen osa (juurielementti).

4. 3 Elementit ja attribuutit

  <?xml version="1.0"?>
  <osallistujat>             <!-- alkutagi -->
    ...
  </osallistujat>            <!-- lopputagi -->
  <?xml version="1.0" encoding="utf-8"?>
  <osallistujat>              
    <nimike nimi="Matti" sposti="matti@x.fi">Pjoht</nimike>
    <nimike sposti="ville@x.fi" nimi="Ville">Siht</nimike>
    <nimike nimi="Kaisa" sposti='kaisa@x.fi' />
    <nimike nimi="Kalle" />   <!-- tyhjän elementin tagi -->
  </osallistujat>             

Merkistön koodauksen tulee olla oikea. Elementit ovat aidosti sisäkkäisiä. Alku- ja lopputagi esiintyvät aina pareittain. Attribuuttien keskinäisellä järjestyksellä ei ole merkitystä.

4. 4 Tehtäviä

Merkkauksen perusteet:

  1. Kopioi oheinen koodinpätkä tiedostoon merk.xml ja merkkaa se käyttäen HTML:stä tuttuja html, body, h1, p, em ja img -elementtejä.
<?xml version="1.0" encoding="iso-8859-1"?>
Tämä on otsikko

Tekstikappaleen sisällä voi tekstiä
esim. korostaa! 

Toisen kappaleen sisältö on pelkkää täytettä.
Lisätään koristeeksi vielä 
kuva jalkapallosta (pallo.png).
  1. Kokeile katsoa dokumenttia esim. XML-tuen tarjoamassa WWW-selaimessa. Löytyikö merkkausvirheitä?

4. 5 Entiteetti- ja merkkiviittaukset

<?xml version="1.0"?>
<esimerkki>
  Hyvää 
    &amp;            <!-- entiteettiviittaus -->
  p&#228;ivää        <!-- merkkiviittaus     -->
  
  <!-- ON 2003 -->   <!-- kommentti ;-)      -->
</esimerkki>

Viittaukset tuovat dokumenttin merkkejä tai tekstiä. <-merkki on dokumentissa aina osa merkkausta (paitsi merkkidatalohkon sisällä...)!

4. 6 Prosessointiohjeet ja merkkidatalohkot

<?xml version="1.0"?>

<!-- prosessointiohje: -->
<?xml-stylesheet type="text/css" href="mystyle.css"?>
<esimerkki>
    <otsikko>Tyyli määrittää ulkoasun</otsikko>
    
    <!-- merkkidatalohko: -->
    <![CDATA[          
      Merkkidatalohkossa <- ja &-merkkejä ei tarvitse
      koodata. ]]>
</esimerkki>

Prosessointiohjeen sisäinen rakenne on merkkijono; tulkinta on sovelluksen tehtävä. Merkkidatalohko ei sisällä merkkausta.

4. 7 Tyhjämerkkien tulkinta

<esimerkki xml:space="default">
  Välilyöntien, tabulointimerkkien ja
    rivinvaihtojen kohtalon päättää sovellus.
</esimerkki>
<esimerkki xml:space="preserve">
Oletuksena tyhjämerkit ovat merkitseviä.
</esimerkki>

Ellei sovellus toisin päätä, tyhjämerkit ovat oletuksena merkitseviä XML:ssä.

4. 8 Tekstin kieli

<esimerkki xml:lang="fi">
Tämä teksti on kirjoitettu suomeksi.
</esimerkki>

XML-dokumentti voi ilmoittaa mitä (luonnollista) kieltä käyttäen dokumentti on kirjoitettu.

4. 9 Loput merkkausrakenteet?

4. 10 Dokumentin jäsennyspuu

<html lang="fi">
  <head><title>Esim</title></head>
  <body><p>Moi!</p></body>
</html>
XML-dokumentin jäsennyspuu

Dokumentin jäsentäminen on sen käsittelyn perusehto.

4. 11 Tehtäviä 1/2

Merkkauksesta on hyötyä vain jos merkkauskielioppia noudatetaan. Helpoin tapa merkkauksen testaamiseen on kokeilla dokumenttia turvallisessa sovelluksessa: XML-suosituksen mukaan XML-prosessorin on keskeytettävä dokumentin käsittely jos se törmää peruuttamattomaan virheeseen (jos lähdedokumentti ei esim. noudata merkkauskielioppia). Seuraavissa tehtävissä on tarkoitus käyttää jotakin XML-tuen tarjoavaa selainohjelmaa, esim. Internet Explorer 5 -selainta tai uudempaa.

Dokumentin tyyppitiedon merkitys XML-dokumentin tulkinnassa:

  1. Kopioi jäsennyspuuesimerkki tekstitiedostoon nimeltä puu.html. Kokeile katsoa XML-dokumenttia selaimessa.
  2. Kopioi jäsennyspuuesimerkki tekstitiedostoon nimeltä puu.xml. Kokeile katsoa XML-dokumenttia selaimessa. Näyttääkö samalta?

Huomaa että puu.html ei ole HTML-tyyppinen dokumentti. (Miksi?)

Merkistövirheet:

  1. Kirjoita elementin p sisään teksti "Minä kirjoitin tämän" (tiedostoon puu.xml). Kokeile selaimessa. Miten kävi? (Osaatko korjata...?)
  2. Kokeile samaa tiedoston puu.html kanssa. Jos lopputulos oli erilainen, osaatko selittää miksi?

Merkkausvirheet:

  1. Poista elementin p lopputagi tiedostosta puu.xml. Kokeile selaimessa.
  2. Kokeile samaa tiedoston puu.html kanssa. Jos lopputulos oli erilainen, osaatko selittää miksi?

Merkkausrakenteet:

  1. Keksi esimerkkejä kaikista tähän asti esitetyistä merkkausrakenteista ja kokeile niitä puu.xml -dokumentissa. Muistitko kaikki?
  2. Piirrä kirjoittamasi dokumentin jäsennyspuu. Osaisitko sanoa miksi jäsennyspuun olemassaolo on niin tärkeää?

TAUKO!

4. 12 Tehtäviä 2/2

Seuraavaksi tutustumme dokumentin jäsennyspuun merkitykseen XML-sovelluksissa. Hauskan sovelluksen aiheesta tarjoaa XML-dokumentin ulkoasun määrittely CSS-tyylien avulla. (CSS:stäkin riittäisi opiskeltavaa yhden koulutuksen tarpeiksi, mutta nyt vedetään mutkat suoriksi jotta päästään kokeilemaan XML:ää...)

  1. Määritellään esimerkkidokumentillemme ulkoasu. Kopio ao. prosessointiohje puu.xml -dokumenttisi alkuun (heti XML-julistusta seuraavalle riville) ja luo uusi tiedosto puu.css (samaan hakemistoon muiden tiedostojen kanssa). Kopioi css-tiedostoon prosessointiohjetta seuraava koodinpätkä. Kokeile katsoa dokumenttia puu.xml selaimessa.
<?xml-stylesheet type="text/css" href="puu.css"?>
body {
  display: block; 
  background: rgb(255,255,0); 
  border-bottom: 5px solid blue;
  }
p {
  display: block; /* voisi olla myös esim. 
                     inline, inherit tai none */
  color: red; 
  font-size: 30px; 
  }

Esimerkissä käytetty tyylikieli on nimeltään Cascading Style Sheets. CSS sopii mainiosti myös HTML-käyttöön. XML-prosessointiohjeen xml-stylesheet vastine XHTML-kielessä on elementin link käyttäminen:

<link rel="stylesheet" type="text/css" href="puu.css" />
  1. Tutustu pintapuolisesti CSS2-määritykseen kahlaamalla läpi luku 2 Introduction to CSS2. (Hyvän tiivistelmän formatointiominaisuuksista tarjoaa liite Appendix F. Property index.) Kokeile formatoida dokumenttiasi eri tavoilla; käytä esim. eri fontteja (ominaisuus font-family), eri värejä (esim. color ja background) sekä erilaisia reunuksia (esim. margin).

CSS-sääntöjen vaikutusalue (ts. se osa dokumenttia johon asetetut ominaisuudet vaikuttavat) määritellään valitsimien avulla. CSS2 määrittelee seuraavissa esimerkeissä esiintyvät valitsimet (joista osa sopii vain esim. HTML-käyttöön):

p { color: blue; }                   /* tyyppivalitsin      */
* { color: blue; }                   /* universaalivalitsin */
p div { color: blue;}                /* jälkeläisvalitsin   */
p > div { color: blue;}              /* lapsivalitsin       */
p + table { color: blue;}            /* sisarvalitsin       */
p[title="esimerkki"] { color: blue;} /* attribuuttivalitsin */
pre.koodi { color: blue;}            /* luokkavalitsin      */
h1#luku1 { color: blue;}             /* ID-valitsin         */

Edellisten lisäksi CSS2 määrittelee vielä erilaisia pseudovalitsimia. (Ikävä kyllä kaikki nykyselaimet eivät toteuta CSS2:a kokonaisuudessaan, esim. sisarvalitsin ei välttämättä toimi.)

  1. Kokeile erilaisten valitsimien toimivuutta selaimessasi (kaikki valitsimet eivät välttämättä toimi: esim. kaikki selaimet eivät syystä tai toisesta toteuta sisarvalitsinta). Keksi ja kirjoita HTML-esimerkkejä merkkausrakenteista joissa erilaisista valitsimista olisi käytännön hyötyä.
  2. Käy keksimäsi esimerkit läpi ja mieti millainen dokumentin jäsennyspuu kutakin esimerkkiä vastaa.

CSS:n sovellusala:

  1. CSS-muotoilun avulla voit tehdä XML-dokumentistasi esim. HTML-sivun näköisen -- mitä HTML-piirteitä et voi XML 1.0/CSS2 -yhdistelmän avulla kuitenkaan toteuttaa? (Mieti tätä myöhemmin nimiavaruuksien käsittelyn yhteydessä!)
  2. CSS sisältää käsitteen Aural style sheets. Miltä XML-dokumenttisi siis voisi myös "näyttää"? (Älä vaivaudu nyt kokeilmaan ...tarvitset todennäköisesti "erikoisvarustellun" selainohjelman [harmi!])

CSS-tyylit sisältävät tiettyjä rajoituksia (mitä?). "Vaativampaan käyttöön" XML-perhe tarjoaa XSL-tyylit; aiheeseen palataan tuonnempana...

5. Dokumenttien looginen ja fyysinen rakenne

XML-dokumentin loogisella rakenteella tarkoitetaan dokumentin jäsennystä sen sanaston käytön suhteen. Tällöin jäsennyspuuhun otetaan erityisesti mukaan elementtien ja attribuuttien tuottamat solmut, mutta esim. merkkiviittauksen tulos tulkitaan osaksi elementin tai attribuutin merkkidatasisältöä.

Kun vielä muistetaan ettei attribuuttien järjestyksellä ole merkitystä, huomataan että esimerkiksi seuraavat kaksi XML-dokumenttia ovat tässä mielessä "samanlaisia":

<b><div>Kuva &#65;1: <img src="a1.png" alt="Jalkapallo"/></div></b>
<!-- versio 2: -->
<b><div>Kuva A1: <img alt="Jalkapallo" src="a1.png" /></div></b>  

Molempien dokumenttien (loogisen rakenteen) jäsennyspuuksi tulee:

XML-dokumentin looginen jäsennyspuu

Jäsennyspuu tarjoaa hyvän välineen dokumentin tyypin määrittämiseen -- kuten esim. XHTML- ja SVG-esimerkeistä todettiin, XML-dokumentin käsittely edellyttää tietoa dokumentin tyypistä.

XML-dokumentin fyysisellä rakenteella puolestaan tarkoitetaan dokumentin talletusrakennetta esim. tiedostoina. Yksi ja sama looginen dokumentti voidaan jakaa useilla eri tavoin fyysisiin osiin.

5. 1 Mitä tarkoitetaan XML-dokumentin tyypillä?

Edellisen valossa XML-dokumentin tyyppi muodostuu dokumentin sanastosta ja sanaston käyttöä ohjaavasta kieliopista. XML 1.0 -suosituksen mukaisesti dokumentin tyyppi määritellään dokumentin tyyppimäärityksen (Document Type Definition, DTD) avulla. (Dokumentin tyypin käsitettä voidaan yleistää -- tähän palataan nimiavaruuksien esittelyn yhteydessä.)

Dokumentin tyyppi mahdollistaa erilaisten sovellusten täsmällisen erottelun toisistaan. HTML-dokumentin täsmällisestä tyypistä sopiminen on perusedellytys esim. WWW-selainohjelmien yhteensopivuuden ja virheettömän toiminnan kannalta. Samantyyppiset dokumentit muodostavat dokumenttiluokan. Tämä ajattelutapa näkyy peruskäsitteistössäkin, esim. yksittäisen XHTML 1.0 Strict -tyyppisen dokumentin esiintymäosa voidaan tulkita ko. tyyppisten dokumenttien luokan esiintymäksi tai ilmentymäksi.

5. 2 XML-dokumentin tyyppimäärittely

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE b [
  <!ELEMENT b (div+)>
  <!ELEMENT div (#PCDATA|img)*>
  <!ELEMENT img EMPTY>
  <!ATTLIST img src CDATA #REQUIRED>
  <!ATTLIST img alt CDATA #IMPLIED>
]>
<b>
  <div>Ks. kuva A1: <img src="a1.png" alt="Jalkapallo"/></div>
</b>

Dokumentin tyyppimäärittely on DTD-kielen avulla määritelty muotti jota ko. tyyppisten dokumenttien esiintymäosan tulee noudattaa.

5. 3 Sisäinen ja ulkoinen DTD-osajoukko

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE b SYSTEM "block.dtd">
<b>
  <div>Ei kuvaa ja kaksi div-elementtiä...</div>
  <div>...silti tyyppiä b!</div>
</b>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

DTD:n voi jakaa osiin. Yleisesti tunnetuille tyyppimäärityksille on sovittu julkisia tunnisteita.

5. 4 Elementtien tyyppimäärittely

<!ELEMENT html (head,body)> <!-- elementtisisältöinen elementti -->
<html>
  <head><!-- ... --></head>
  <body><!-- ... --></body>
</html>
<!ELEMENT p (#PCDATA|img)*> <!-- yhdistelmäsisältöinen elementti -->
<p>
  Merkkidataa
  <!-- ... -->
    <img><!-- ... --></img>
  <!-- ... -->
    <img><!-- ... --></img>
  <!-- ... -->
</p>
<!ELEMENT hr EMPTY> <!-- tyhjä elementti -->
<hr />
<!ELEMENT sulkeuma ANY> <!-- rajoitteeton elementti -->
<sulkeuma>
   <!-- ... -->
   <sulkeuma>
     <!-- ... -->
   </sulkeuma>
   <!-- ... -->
</sulkeuma>

Elementin tyyppimäärittely osoittaa elementin sisäisen rakenteen.

5. 5 Elementin sisältömallin määrittely

<!ELEMENT chapt  (h1,sect+,refs?)> 
<!ELEMENT sect   (h2,(p|object)*,exercise*)> 
<!ELEMENT object (desc,(img|table))>
<!-- ... -->
A, B B seuraa A:ta
A | B A tai B (muttei molempia)
A? A esiinty kerran tai ei ollenkaan
A+ A esiintyy yhden tai useamman kerran
A* A esiintyy yhden tai useamman kerran tai ei ollenkaan
(...) osamallien ryhmittely

Säännönmukaisten lausekkeiden käyttö mahdollistaa geneerisen elementtimäärittelyn.

5. 6 Tehtäviä

Dokumentin kirjoittaminen:

  1. Kopioi oheinen koodinpätkä tiedostoon esim.myhtml ja täydennä se validiksi XML-dokumentiksi:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE myhtml [
  <!ELEMENT myhtml (head,body)>
  <!ELEMENT head   (title)> 
  <!ELEMENT body   (h1,p+,note?)>
  <!ELEMENT p      (#PCDATA|em)*>
  <!ELEMENT title  (#PCDATA)>
  <!ELEMENT h1     (#PCDATA)>
  <!ELEMENT em     (#PCDATA)>
  <!ELEMENT note   (#PCDATA)>
]>
<myhtml>
  <!-- ... -->
</myhtml>

Dokumentin tyypin tarkistaminen (eli validoiminen) on mekaanista ja virhealtista puuhaa joka yleisesti ottaen kannattaa jättää tietokoneiden tehtäväksi. Opiskelumielessä pienten dokumenttien validointi sujuu esim. STG:n on-line validaattorilla.

  1. Validoi dokumenttisi esim.myhtml STG-validaattorin avulla.
  2. Huomaa että myhtml-tyyppisten dokumenttien esiintymäosa voi vaihdella paitsi tekstisisällöltään, myös rakenteeltaan (tyyppimäärittelyn puitteissa). Mieti millaisia muutoksia voisit dokumentin esiintymäosaan tehdä (ts. millaisia myhtml-tyyppiset dokumentit ovat).

Kuten kenties huomasitkin, validointi sisältää aina myös merkkauskieliopin tarkistamisen (koska muuten dokumentin looginen jäsentäminen ei olisi edes mahdollista).

Dokumentin jäsennyspuuta voi käyttää myös tyypin suunnittelun visuaalisena apuvälineenä. Tällöin dokumentin tyyppimäärittely voidaan esittää puudiagrammin avulla jossa osamalleissa esiintyvät kertoja yms. notaatio on piirretty kaikki sovelluksen sanat esittävän puun yhteyteen.

5. 7 Attribuuttien tyyppimäärittely

<!ELEMENT img EMPTY>
<!ATTLIST img src CDATA "notavailable.png">
<!ATTLIST img class  (bitmap|vector) #REQUIRED>
<!ATTLIST img style  CDATA           #IMPLIED>
<!ATTLIST img id     ID              #REQUIRED>
<!ATTLIST img editor CDATA           #FIXED "ver-002">
<!ELEMENT a (#PCDATA)>
<!ATTLIST a href IDREF #REQUIRED>

Attribuutin tyyppimäärittely liittää elementtiin attribuutin.

5. 8 XML-dokumentin fyysinen rakenne

Esimerkki XML-dokumentin fyysisestä rakenteesta -- makromainen sisäinen tekstientiteetti ja ulkoissa tiedostossa sijaitseva tekstientiteetti.

Merkkaajan näkökulmasta entiteettien tärkein sovellus XML-dokumentin pilkkominen osiin.

5. 9 "Muuta fyysiseen rakenteeseen liittyvää"

<!NOTATION png SYSTEM "Image/png">
<!ENTITY cover-pic SYSTEM "p1.png" NDATA png>
<!ENTITY % coreattrs 
  "id    ID    #IMPLIED
   class CDATA #IMPLIED">

<!ATTLIST doc %coreattrs;
              type (page|slide) #IMPLIED>

Muista entiteettityypeistä tärkein on parametrientiteetti, jonka avulla voidaan sieventää DTD:tä.

5. 10 Tehtäviä

Dokumentin tyyppimäärittelyn kirjoittaminen.

  1. Kirjoita seuraavalle dokumentille (sisäinen) DTD siten, että attribuutti id määritellään ID-tyyppiseksi ja ref IDREF-tyyppiseksi. Talleta dokumenttisi tiedostoon pipari.xml.
<?xml version="1.0" encoding="iso-8859-1"?>
<note>
  <p>
     <dfn id="p">Porkkana</dfn> on juures.
     <dfn id="p">Pipari</dfn> on pikkuleipä. 
  </p>
  <p>
    Mieleni tekisi syödä vain pelkkiä
    <link ref="p">pipareita</link>.
  </p>
</note>      
  1. Kokeile validoida dokumenttisi esim. STG-validaattorin avulla -- tuliko virheilmoituksia? (Osaatko korjata? [Vinkki: ID-attribuutin yksikäsitteisyys määritellään vasta dokumentin tyypin avulla.])

Tekstientiteettien käyttö.

  1. Pilko oheinen XML-dokumentti viideksi tiedostoksi (loru.xml, loru.dtd, p1.xml, p2.xml sekä p3.xml) ja toteuta toistuva SATU-merkkijono tekstientiteetillä (lorussa esiintyvän nimen muuttaminen):
<?xml version="1.0" encoding="iso-8859-1"?>
<loru>
  <p>SATU meni saunaan, laittoi laukun naulaan.</p>
  <p>SATU tuli saunasta, otti laukun naulasta.</p>
  <p>SATU oppi XM-kieltä -- lorussa tässä ei
  mitään mieltä.</p>
</loru>
  1. Kokeile dokumenttiasi selaimessa.

6. Nimiavaruudet

Yhteinen merkkauskielioppi on XML:n perusta. Kuka tahansa voi kehittää XML-sovelluksia. Käytännössä XML:stä saadaan suurin hyöty eri sovelluksia yhdistelemällä. Mielekkäitä käyttötapauksia ovat esim.

Ilman yhteistä sopimusta eri sanastojen nimeämisestä, näissä kaikissa sovelluksissa olisi vaarana se, että (sattumalta) eri asiaa tarkoittavat mutta saman nimiset sanat menisivät sekaisin. Sanojen törmäysten välttämiseksi nimet sijoitellaan suunnitteluvaiheessa eri nimiavaruuksiin. Nimiavaruudet määrittelee suositus Namespaces in XML. Käytännössä nimiavaruuksien tulkinta täydentää XML 1.0 -suositusta XML-merkkauksen kiinteänä osana.

6. 1 Mikä nimiavaruus "on"?

XML-nimiavaruus on yksikäsitteinen URI-merkkijono. Esim. XHTML-kielen nimiavaruudeksi on valittu http://www.w3.org/1999/xhtml. Käsitteellisesti nimiavaruus niputtaa eri sovellusten sanastot "omiin pusseihinsa" minkä avulla eri sovellusten saman nimiset sanat eivät mene sekaisin.

Nimiavaruuruden "osoittamasta paikasta" (jos käytetään esim. URL-merkkijonoa) ei tarvitse löytyä HTTP-palvelun mielessä yhtään mitään. Joskin voi löytyä -- vrt. XHTML-nimiavaruus edellä (kokeile!).

6. 2 Perusidea

XHTML ja SVG-sanastojen elementin A tulkinta ei mene nimiavaruuksien       ansiosta sekaisin.

Nimiavaruudet lokeroivat eri sovellusten sanastot.

6. 3 Esimerkki: XHTML + SVG

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>SVG-esimerkki</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
  <h1>SVG-kuva:</h1>
  <object data="pic.svg" width="200px" height="100px" type="image/svg+xml" />
</body></html>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200px" height="100px" viewBox="0 0 200 100" version="1.1"
     xmlns="http://www.w3.org/2000/svg">
    <ellipse cx="100" cy="50" rx="90" ry="40" fill="red" /> </svg>

Jokaiselle sanastolle voidaan keksiä yksikäsitteinen nimiavaruus. Esimerkiksi XHTML-sanaston nimiavaruus on http://www.w3.org/1999/xhtml ja SVG-sanaston nimiavaruus on http://www.w3.org/2000/svg. Eri sovellusten sanastoja yhdistellään näiden suunniteluratkaisujen tarjoamissa puitteissa.

6. 4 Oletusnimiavaruus ja kvalifioitu nimiavaruus

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" 
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg width="5cm" height="3cm" viewBox="0 0 5 3"
     xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <rect x=".01" y=".01" width="4.98" height="2.98" 
        fill="none" stroke="blue"  stroke-width=".03"/>
  <a xlink:href="http://www.w3.org">
    <ellipse cx="2.5" cy="1.5" rx="2" ry="1"
             fill="red" /> </a>
</svg>

Nimiavaruuden syntaksi on XML-attribuutin syntaksi (+ kaksoispisteen käyttö erotinmerkkinä); tulkinta rakentuu nimiavaruuksien erikseen määritellyn semantiikan varaan.

6. 5 Tehtäviä

Nimiavaruuksien peruskäsitteet:

  1. Mieti mihin nimiavaruuksiin seuraavan dokumentin nimet kuuluvat:
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="fi">
  <head>
     <title>Esimerkki</title>
  </head>
  <body>
    <h1>Jekku</h1>
    <p>Helppo nakki.</p>
    <p xml:lang="en">Piece of cake.</p>
  </body>
</html>
  1. Onko kyseessä HTML-tyyppinen dokumentti?

Tällä XML-peruskurssilla toisen kunnon esimerkin sovelluksesta jossa nimiavaruuksia toden teolla tarvitaan, ovat XSL-muunnokset. (Ensimmäinen esimerkki oli SOAP.)

6. 6 Nimiavaruudet ja dokumentin tyyppimäärittely: XML Schema

<!ELEMENT html (head,body)>
<!ATTLIST html xmlns CDATA #REQUIRED>
...
<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>

XML DTD ei ole ainoa tapa määritellä dokumentin tyyppi. XML Schema -tyyppimäärittely mahdollistaa myös nimiavaruudet huomioivan tyyppimäärittelyn.

7. XML ja tyylit

Tyylien perusidea on erottaa dokumenttien tietosisältöä kuvaava rakenne dokumenttien esitystavasta. Esimerkiksi XML- tai HTML-dokumentin ulkoasu voidaan asettaa CSS-tyylin avulla. Tyylien käyttö tarjoaa mm. seuraavia merkittäviä etuja:

Edellisistä seuraa erityisesti että hyvin suunniteltu dokumentti voidaan ainakin periaatteessa esittää eri päätelaitteita ja eri medioita hyödyntäen (esim. paperi, pc, kämmenmikro ja puhe). Tyylit tarjoavat siten välineitä paitsi monikanavajulkaisemiseen ja dokumenttien ylläpitoon, myös esim. saavutettavan aineiston tuottamiseen (esim. tiputtamalla turhat kuvat pois kämmenmikroihin tarkoitetusta materiaalista tai lisäämällä tekstin kontrastia heikkonäköisille).

CSS ei ole ainoa XML-käyttöön sopiva tyylikieli. XML-perhe määrittelee XSL-tyylin (Ks. The Extensible Stylesheet Language (XSL)). XSL-tyylien määrittely koostuu käytännössä kolmesta osasta:

Tällä XML-peruskurssilla tutustutaan vain yleiskäyttöisiin XSL-muunnoksiin (ja varsin lyhyesti, esimerkkien kautta). Muunnosten avulla voidaan suorittaa myös muuta kuin dokumenttien esitystapaan liittyvää tietojenkäsittelyä, esim kuvata tietoa sanastosta toiseen.

7. 1 Miksi XML-käyttöön tarvitaan useita eri tyylikieliä?

CSS ja XSL soveltuvat erilaiseen käyttöön. Helposti omaksuttava CSS on esimerkki lähdedokumenttia päällystävästä tyylistä -- lähdedokumentin osille voidaan määritellä erilaisia formatointiominaisuuksia mutta dokumentin rakenteeseen ei ole juuri mahdollista vaikuttaa. XSL taasen on esimerkki muunnostyylistä -- tyylin avulla on paitsi mahdollista formatoida elementtejä, myös täysin muuttaa dokumentin rakennetta. XSL kuvaa CSS:ää monipuolisemmin myös esim. sivuntaittoon liittyviä käsitteitä.

(CSS:n osaamisesta on hyötyä myös konkreettista hyötyä XSL:ää käytettäessä; XSL esim. käyttää suoraan hyödykseen CSS-tyylien ominaisuuksia.)

7. 2 XSL Transformations -- XSLT (versio 1.0)

Lähde- ja tulospuita havainnollistavat puudiagrammit jossa memo-dokumentti kuvataan html-dokumentiksi.

XSL-muunnostyyli on kahden dokumentin jäsennyspuun välinen kuvaus.

7. 3 Esimerkki

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output 
    method="xml" indent="yes" encoding="iso-8859-1"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

  <xsl:template match="/memo">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head> <title><xsl:value-of select="title" /></title> </head>
      <body> <xsl:apply-templates /> </body>
    </html>
  </xsl:template>

  <xsl:template match="p">
    <p xmlns="http://www.w3.org/1999/xhtml"><xsl:value-of select="." /></p>
  </xsl:template>

  <xsl:template match="*" />
  
</xsl:stylesheet>

Muunnostyylin suorituksessa säännöistä valitaan aina lähdepuun kontekstia parhaiten vastaava sääntö. Muunnoksen suoritus päättyy kun sovellettavaa sääntöä ei enää seuraa toinen sääntö.

7. 4 Muunnosten hahmojen kielioppi

child::para/descendant-or-self::node()/child::ulist/child::item[position()=1]
para//ulist/item[position()=1]
/html//p//a@href

Muunnosten hahmojen kielioppi perustuu XPath-lausekkeisiin.

7. 5 Komennot

<xsl:template match="item">
  <a>
    <xsl:choose>
      <xsl:when test="@class='vihje'">
        <xsl:attribute name="href">hint.html</xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:attribute name="href"><xsl:value-of select="@link" /></xsl:attribute>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="." />
  </a>
</xsl:template>

XSL-muunnokset perustuvat funktionaalisen ohjelmoinnin periaatteeseen. XSL-komentojen avulla on kuitenkin mahdollista toteuttaa tutut lausekielisen ohjelmoinnin perusrakenteet.

7. 6 Tehtäviä

Yleisessä tapauksessa muunnosten suorittaminen onnistuu luotettavimmin erillisten XSL-muunnosohjelmien avulla (ks. esim. Saxon tai Xalan).

  1. Kokeile edellä esitettyä muunnosta memo-html.xsl käytännössä. Kopioi se ja lähdedokumentti muistio.xml talteen omaan työhakemistoosi ja muunna se tiedostoksi muistio.html. (Esim. Instant Saxon -ohjelmalla komentorivi olisi saxon muistio.xml memo-html.xsl > test.html) )
  2. Muunnostyylin liittäminen xml-dokumenttiin on periaatteessa yhtä helppoa kuin CSS:nkin tapauksessa. Kokeile (ei toimi kaikissa selaimissa) liittää seuraava rivi tiedoston muistio.xml alkuun:
<?xml-stylesheet type="text/xsl" href="memo-html.xsl"?>
  1. Kirjoita muunnos joka muuntaa seuraavan dokumentin HTML-sivuksi:
<?xml version="1.0" encoding="iso-8859-1"?>
<memo>
  <title>XML-kurssin kuvaus</title>
  <sect>
    <title>Esittely</title>
    <p>Kurssilla opitaan XML:n perusteet,
    merkkauskielioppi ja tutustutaan yksinkertaisiin
    sovelluksiin.</p>
    <p>Tarkoituksena on tarjota eväät omaehtoiseen
    oppimiseen.</p>
  </sect>
  <sect>
    <title>XML</title>
    <p>XML on kokonainen perhe teknologioita.</p>
    <p>XML:n merkitys aukeaa vasta sen sovellusten kautta.
    Useat Web-teknologiat perustuvat tavalla tai toisella
    XML:n hyödyntämiseen.
    </p>
  </sect>
</memo>

8. Yhteenveto

XML on kokonainen perhe teknologioita. Useat Web-teknologiat perustuvat tavalla tai toisella XML:n hyödyntämiseen. XML-peruskurssi tarjosi tiiviin johdannon XML-maailman perusteisiin. Tietojen ja taitojen karttuessa XML-merkkaus ja perustekniikat siirtyvät työssä sivummalle ja huomio kohdistuu sovellusten parissa työskentelyyn.

Menestystä XML:n soveltamiseen työssäsi!

Perustietojen karttuessa XML:n opiskelun painopiste siirtyy sovellusten suuntaan. XML-peruskurssin tavoite on yksilöllisen XML-opiskelun alkutaipaleen tasoittaminen.

8. 1 Tiivistelmä

Esipuhe. XML-peruskurssin tavoitteena on yleiskatsaus XML-perusteisiin ja merkkauksen opettelu. Edistyneempi XML-osaaminen edellyttää myös sen sovellusten tuntemusta.

Johdanto. Merkkaaminen suoritetaan poikkeuksetta tietojenkäsittelyn ja "tietokoneiden" näkökulmasta. Merkkauskielioppi on kaikille XML-sovelluksille yksi ja sama. Kukin sovellus määrittelee oman sanastonsa (tai yhdistelee useita sanastoja). Eräs XML:n käyttökelpoisuuden syistä on selkeän työnjaon osoittaminen erilaisten tietojenkäsittelytehtävien välillä. XML-prosessorin ja XML-sovelluksen erottaminen toisistaan on tästä hyvä esimerkki. XML on kokonainen perhe standardinomaisia teknologioita. XML-merkkaus on vain jäävuoren huippu. W3C:n XML-spesifikaatiot ovat ainoa virallinen XML:n määrittelevä lähde. Koulutusmateriaali ja kirjallisuus on suunniteltu välittämään tätä tietoutta havainnollisesti erilaisten sovellusten yhteydessä.

Sovelluksia. W3C-suosituksen mukainen WWW-sivu on XHTML-tyyppinen XML-dokumentti. W3C-suosituksen mukainen SVG-kuva on SVG-tyyppinen XML-dokumentti (tai dokumentin osa). XML:n käyttöön ei tarvitse liittyä ajatusta "dokumentista joka luetaan" -- kyse voi olla myös "viestistä" tai "tietorakenteesta".

Merkkaus. XML-merkkauksen perusta on hierakkinen elementtirakenne. Attribuutit liittyvät elementtien alkutagiin (tai tyhjän elementin tagiin). Dokumentin tekstisisällön käsittävä esiintymäosa on XML-dokumentin ainoa pakollinen osa (juurielementti). Merkistön koodauksen tulee olla oikea. Elementit ovat aidosti sisäkkäisiä. Alku- ja lopputagi esiintyvät aina pareittain. Attribuuttien keskinäisellä järjestyksellä ei ole merkitystä. Viittaukset tuovat dokumenttin merkkejä tai tekstiä. <-merkki on dokumentissa aina osa merkkausta (paitsi merkkidatalohkon sisällä...)! Prosessointiohjeen sisäinen rakenne on merkkijono; tulkinta on sovelluksen tehtävä. Merkkidatalohko ei sisällä merkkausta. Ellei sovellus toisin päätä, tyhjämerkit ovat oletuksena merkitseviä XML:ssä. XML-dokumentti voi ilmoittaa mitä (luonnollista) kieltä käyttäen dokumentti on kirjoitettu. Dokumentin jäsentäminen on sen käsittelyn perusehto.

Rakenne. Dokumentin tyyppimäärittely on DTD-kielen avulla määritelty muotti jota ko. tyyppisten dokumenttien esiintymäosan tulee noudattaa. DTD:n voi jakaa osiin. Yleisesti tunnetuille tyyppimäärityksille on sovittu julkisia tunnisteita. Elementin tyyppimäärittely osoittaa elementin sisäisen rakenteen. Säännönmukaisten lausekkeiden käyttö mahdollistaa geneerisen elementtimäärittelyn. Attribuutin tyyppimäärittely liittää elementtiin attribuutin. Merkkaajan näkökulmasta entiteettien tärkein sovellus XML-dokumentin pilkkominen osiin. Muista entiteettityypeistä tärkein on parametrientiteetti, jonka avulla voidaan sieventää DTD:tä.

Nimiavaruudet. Nimiavaruudet lokeroivat eri sovellusten sanastot. Jokaiselle sanastolle voidaan keksiä yksikäsitteinen nimiavaruus. Esimerkiksi XHTML-sanaston nimiavaruus on http://www.w3.org/1999/xhtml ja SVG-sanaston nimiavaruus on http://www.w3.org/2000/svg. Eri sovellusten sanastoja yhdistellään näiden suunniteluratkaisujen tarjoamissa puitteissa. Nimiavaruuden syntaksi on XML-attribuutin syntaksi (+ kaksoispisteen käyttö erotinmerkkinä); tulkinta rakentuu nimiavaruuksien erikseen määritellyn semantiikan varaan. XML DTD ei ole ainoa tapa määritellä dokumentin tyyppi. XML Schema -tyyppimäärittely mahdollistaa myös nimiavaruudet huomioivan tyyppimäärittelyn.

Tyylit. XSL-muunnostyyli on kahden dokumentin jäsennyspuun välinen kuvaus. Muunnostyylin suorituksessa säännöistä valitaan aina lähdepuun kontekstia parhaiten vastaava sääntö. Muunnoksen suoritus päättyy kun sovellettavaa sääntöä ei enää seuraa toinen sääntö. Muunnosten hahmojen kielioppi perustuu XPath-lausekkeisiin. XSL-muunnokset perustuvat funktionaalisen ohjelmoinnin periaatteeseen. XSL-komentojen avulla on kuitenkin mahdollista toteuttaa tutut lausekielisen ohjelmoinnin perusrakenteet.

Yhteenveto. Perustietojen karttuessa XML:n opiskelun painopiste siirtyy sovellusten suuntaan. XML-peruskurssin tavoite on yksilöllisen XML-opiskelun alkutaipaleen tasoittaminen.