Luettelen alla aihealueittain tekemäni aihepiirit. Paluulinkkeinä tähän aihepiiriin on tämä valikko ja sivun yläreunassa oleva linkki Aihepiiriluettelo.
| ||||||||||||||||||||||||||
![]() | Aihepiiriluettelo > CSS-oppaan etusivu > Oppaan lisäsivut > K Miten XML-dokumenttien kanssa voi käyttää CSS:ää |
|---|
XML on suhteessa HTML:ään itsenäinen kieli.
Sillä on toki HTML:n kanssa yhteisenä "emona" SGML![[S]](../Kuvat/buttons/S.gif)
(lue
myös XML:n selitys). Myös XML on metakieli,
joka sisältää perussäännöt sille,
miten XML-pohjaisia kieliä tulee rakentaa. Kieli on
syntaksin osalta tiukemmin tyypitetty kuin HTML.
Toisin kuin HTML, XML ei itsessään omaa ainuttakaan
muotoilukoodia. XML on puhdas merkintäkieli (markup
language), jolloin kaikki aloitus- ja
päätöskoodit (engl. start-tag ja
end-tag) sekä tyhjien elementtien koodit ovat
itsessään vain ja ainoastaan merkintäkoodeja.
Dokumentin muotoilu ja sen esitystapa määräytyy
käytetyistä apukielistä (esim. CSS ja HTML)
käsin (tähän tosiasiaan perustuu myös se,
miten olen kääntänyt sanan tag; ks.
käännösvastineen
perustelut![[S]](../Kuvat/buttons/S.gif)
.
Tällä kertaa tarkastelen sitä, miten
XML-dokumentteja voi muotoilla CSS:n avulla. Oletuksena on
myös se, että käytettyjä elementtejä ei
kuvata millään muulla kielellä. XML:n elementeille
voi luoda DTD tai XSD (XML Schema
Document) -tiedostot, joissa kuvataan elementtien ja
attribuuttien oikea käyttö. Niiden
käyttäminen ei ole kuitenkaan
välttämätöntä. Yhteistä kaikille
XML-kielille on vain se, että niissä
käytetään dokumentin alussa kuvausilmoituksia
(declarations - selostan niitä (X)HTML nooteissa
), esim.:
<?xml version="1.0"?>
<?xml-stylesheet href="XML.css" type="text/css"?>
<!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">
CSS2:een on lisätty joitakin piirteitä varta vasten XML + CSS -yhdistelmän toteuttamiseksi tarvittavia piirteitä. Näin ollen kunnollinen toteutus edellyttää seuraavien seikkojen toimivuutta, jotta selainta voidaan pitää XML + CSS -tason selaimena:
![[S]](../Kuvat/buttons/S.gif)
tukeminen on
välttämätöntä.display-ominaisuuden
tukeminen![[S]](../Kuvat/buttons/S.gif)
niin
että voidaan luoda ainakin yksinkertaisia taulukoita ja
listaesityksiä.Huomautus 1. Ensimmäisen
periaatteen suhteen MS IE 5.0 -selainta ei voi pitää
todellisena XML + CSS selaimena, sillä se tukee
vanhentunutta virallista XML-tyylitiedosto syntaksia
edeltäviin ehdotuksiin (proposals - niitä
kutsutaan nimellä Working Drafts) perustuvaa
<?xml:stylesheet ...?>
määrittelytapaa. Spesifikaation mukainen syntaksi on
<?xml-stylesheet ...?>, jota tukee MS IE 5.5.
Tässä mielessä MS IE 5.5 on ensimmäinen
Microsoftin valmistama selain, jota voi pitää
XML-selaimena.
Huomautus 2. MS IE kuten myös Opera 4.x+
tukevat kuitenkin sellaisia CSS-sääntöjä,
jotka on tarkoitettu vain HTML-dokumenteille (ks. sivu Valitsimet kohdasta Attribuuttivalitsimet
).
Huomautus 3. Toisen ja kolmannen kohdan perusteella vain Opera 4.x+ ja Netscape 6.x -selaimia voi näillä perusteilla pitää kunnollisina XML + CSS-toteutukseen pystyvinä selaimina. MS IE 5.5 ei ole kunnollinen XML + CSS selain, sillä se ei tue välttämättömiä CSS2-piirteitä.
Muistutan vielä siitä, että tällä sivulla esimerkkinä käytetyt asiakirjat eivät ole täysin toimivia web-asiakirjoja. CSS on puhdas muotoilukieli ja XML on puhdas merkintäkieli. Lopputuloksena on XML-dokumentti ilman linkitystä ja XML:n kautta linkitettäviä elementtejä. XML ei yksinään ole edes hypertekstikieli. Toimiva XML-dokumentti tarvitsee linkityksen, jonka voi toteuttaa useammalla tavalla (en käsittele tässä yhteydessä linkitysmahdollisuuksia). Esimerkkidokumentit vastaavat lähinnä tavanomaista tekstinkäsittelyohjelmalla tehtyä dokumenttia.
Otan esimerkiksi dokumentin, joka käyttää saman
nimisiä elementtejä kuin HTML-dokumentit. Annan
esimerkkinä olevalle XML-dokumentille ainoaksi avuksi
linkitettävän CSS-tiedoston (<?xml-stylesheet
href="xml-sheet.css" type="text/css" ?>).
Jos tuotakaan ei anneta, MS IE 5.x näyttää
dokumentin tekstitiedoston tapaisesti, mutta koodit on merkitty eri
väreillä ja koodit on sisennetty (![[M]](../Kuvat/buttons/M.gif)
![[S]](../Kuvat/buttons/S.gif)
).
Toisaalta jos linkitetty
CSS-tiedosto ei sisällä mitään tietoa or
tiedostoa ei löydy, kaikki teksti on lähes
peräkkäin, esim. (olen antanut esimerkin sivulle
tyylisivutiedoston, jota ei ole olemassa):
<?xml version="1.0"?>meta1- elementti META -
<?xml-stylesheet href="xml-sheet2.css" type="text/css" ?>
<html>
<head>
<meta name="robots" content="noindex"></meta>Uutta tyyliä - elementti STYLE -
...
<style type="text/css></style>Problems in the new technology - elementti TITLE -
<title></title>Problems
</head>
<body>
<h2><a name="Uutta"></a></h2>Structural solutions
<p><b></b></p>
...
näkyy tähän tapaan (![[M]](../Kuvat/buttons/M.gif)
![[S]](../Kuvat/buttons/S.gif)
):
meta1-
elementti META - Uutta tyyliä - elementti STYLE- Problems in
the new technology - elementti TITLE - Problems Structural
solutions ...
Elementtejä erottaa vain yksi
välilyönti eikä elementin alkua tai loppua voi
tietää.
Kun tyylisivuja käytetään lähes jokainen
elementti pitää määritellä jollakin
tavoin. Vain sellaiset tyhjät elementit, joiden
perässä ei ole testiä, eivät tarvitse
määrittelyä. Tässä on syytä muistaa
myös se, että elementtien head ja
body koodeilla ei ole mitään
periaatteellista eroa, mikäli DTD-tiedostoa ei ole
määritelty. Koska siinä ole
myöskään standardisoituja elementtejä, voit
vapaasti muuttaa head elementin sisällä
olevien elementtien luonnetta normaalista elementistä
tyhjäksi elementiksi tai päinvastoin. Voit kirjoittaa
myös koodien
<head></head> sisälle
tekstiä eikä se ole mikään virhe.
XML-dokumentille olennaista on vain juurielementti ja että
sen sisällä olevat elementit ovat oikein muotoiltuja
(well-formed).
Tämä sekä rajoittaa että laajentaa
tyylisivuen käyttämistä. Toisaalta voit
halutessasi näyttää esim. elementin
title sisällön. Se ei ole todellinen
TITLE elementti muuten kuin selaimille, jotka
eivät ymmärrä XML-dokumentteja ja jotka
tulkitsevat ne HTML:nä. Mutta XML-selaimessa se ei
esimerkkidokumenteissani hoida edes tuota virkaa, koska elementin
tehtävää ei ole kuvattu. Toisaalta et voi poistaa
näytöltä ominaisuudella display:none
tavanomaisesti käytettyä elementtiä
meta, mikäli olet laittanut sen
perään tekstiä, esim. (![[M]](../Kuvat/buttons/M.gif)
![[S]](../Kuvat/buttons/S.gif)
):
<meta name="robots"
content="noindex" />meta1- elementti META
-
Tuossa tapauksessa elementillä on tosin
tehtävä, mutta se johdu elementistä
itsestään, vaan siitä, että hakurobotit
tunnistavat kyseisen elementin! Mutta jos antaisin sille esim. MS
IE 5.0:aa koskevan tehtävän, elementti ei sitä
toteuttaisi. Jos seuraava koodi olisi HTML-dokumentissa, selain
siirtyisi automaattisesti toiselle sivulle. Esimerkkinä
käyttämissäni XML-tiedostoissa niin ei tapahtuisi.
Elementin attribuutit olisivat selaimelle sama kuin selain saisi
luettavakseen attribuutti="0".
<meta http-equiv="refresh"
content="0; url=../Teaching/XSL.html" />
Sama pätee myös HTML-elementteihin HR
ja BR, mikäli niitä
käytetään XML-dokumenteissa. Jos laitat
elementille meta sekä aloitus- että
päätöskoodit, voit käyttää
sitä täysipainoisesti muotoilukoodina, vaikka
HTML-dokumentin suhteen näin et voi toimia. Ilman
sisältöäkin voi niitä käyttää
rajoitetusti muotoilukoodeina (display:block saa
aikaan rivinkatkon). Opera 4.x+:lla ja Netscape 6.x.llä voit
määritellä meta:before ja
meta:after säännöt, jolloin
tyhjäkin elementti toimii laajemmin muotoilukoodina. Tyhjien
elementtien käyttö muotoilukoodina on kuitenkin
rajoittuneempaa kuin päätösmerkkauksellisten
elementtien.
Seuraavassa on esimerkki CSS-tiedostosta, jossa myös
elementti head ja sen sisällä olevat
elementit on määritelty. Vain elementti
meta on piilotettu (![[M]](../Kuvat/buttons/M.gif)
![[S]](../Kuvat/buttons/S.gif)
):
head {font-family:Verdana,
sans-serif; display:block; background-color:aqua}
meta {display:none}
style {display:block; background-color:yellow}
title {display:block; background-color:yellow; border: 1px solid
#660033}
body {font-family:Verdana, sans-serif; display:block}
h2 {font-size:21px; display:block; text-align:center;}
p {display:block; margin-top:1em;}
Nyt selain muotoilee dokumentin! Huomaa, että elementille
P tulee määritellä sen marginaalit -
muuten elementit ovat perä perää. Vasta tuon
määrittelyn jälkeen sivu alkaa muistuttamaan
HTML-dokumentteja! Määriteltyjen elementtien aloitus-
ja päätöskoodit muuntuvat CSS:n avulla
muotoilukoodeiksi. Todellisuudessa esimerkkidokumentti
sisältää enemmän elementtejä kuin tuossa
CSS-tiedostossa on kuvattu. Täysin
määrittelemättömät elementit eivät
vaikuta millään lailla dokumentin esitysasuun.
Dokumentin esitysasusta puuttuu mm. elementin b
määrittely.
Koska XML ei ole muotoilukieli, XML-elementit eivät itsessään jakaannu lohko- eikä rivinsisäiselementteihin (block level elements - in-line elements) - niiden olemassaolo määräytyy apukielistä käsin or DTD-tiedostoilla. XML:n näkökulmasta ei ole väärin laittaa lohkoelementiksi CSS:n avulla kuvattua elementtiä rivinsisäiselementin sisälle. Kun sivujen ulkoasu määritellään CSS:n avulla, sivujen tekijä joutuu itse vastaamaan oikeasta elementtien sijoittelusta. Elementtien sisäkkäisten suhteiden toimivuutta ei voi tarkastaa millään validaattoriohjelmalla, mikäli DTD-tiedostoa ei ole määritelty. Väärä sijoittelu saattaa johtaa siihen, että sivu muotoutuu epämääräisesti.
Toinen esimerkki. Otetaan esimerkiksi tiedosto, jolla on pääte xml ja sen sisällä on koodi:
<table>tekstiä
<tr>
<td></td>tekstiä
<td></td>
</tr>
</table>
MS IE 5.0 -selain joko näyttää tuon juuri tuon tapaisena, jos dokumentin elementeiltä puuttuu kuvaus. Yksikään noista koodeista ei toimi ilman kuvausta muotoilukoodina. XML:ssä tuo koodisarja on vain sarja tietyn nimisiä elementtejä ja on aivan sama vaikka niiden tilalla lukisi näin:
<taulukko>tekstiä
<taulukkorivi>
<taulukkosolu></taulukkosolu>tekstiä
<taulukkosolu></taulukkosolu>
</taulukkorivi>
</taulukko>
Voit periaatteessa määritellä CSS:n avulla,
että elementti taulukko muotoillaan kuten
HTML-elementti TABLE jne. Tosin muotoilu onnistuu
vain Opera 4.x+ ja Netscape 6.x+ -selaimilla. MS IE 5.0 ei kykene
muotoilemaan tuosta CSS:n avulla taulukkoa. Samoin em. selain ei
pysty luomaan CSS:n avulla listaelementtejä (ks. sivu Muotoilut![[S]](../Kuvat/buttons/S.gif)
).
Mikäli XML-dokumenteissa halutaan käyttää
taulukko- tai listamuotoisia esityksiä, MS IE 5.0 -selaimelle
dokumentin muotoilu ja elementtien esitysasu täytyy
toteuttaa XSL![[S]](../Kuvat/buttons/S.gif)
kielen
avulla. Käytännössä
loppudokumentti täytyy olla XHTML-dokumentti, jossa voi olla
muiden XML-pohjaisten kielten elementtejä.
Netscape 6.0 tukee jossakin määrin XLink-kieltä, joten sille saa toimivan linkityksen. Opera käyttää selainkohtaisia CSS-ominaisuuksia, joten linkityksen suhteen se ei ole kunnon XML-selain.
MS IE 5.5:lle saa linkityksen xmlns-attribuutin
kautta. MS IE 5.5 tukee DTD-tiedostoja, joten tässä
mielessä se on todellinen XML-selain. Opera ja Mozilla 0.7
eivät reagoi DTD-tiedoston virheisiin, joten ne eivät
niitä lue. IE 5.5 tukee myös ns. skeemoja, joten kaikki
piirteet huomioon ottaen sitä voi pitää
kehittyneimpänä XML-selaimena.
Mikään selain ei tosin ole ihan kunnollinen, sillä edes jossakin määrin kunnon XML-toteutus edellyttäisi:
display-ominaisuuden
toteutus ja yleisten attribuuttivalitsimien tukeminen.Huomautus 1. XSL-tuki ei ole välttämätön selaimelle, sillä XSL:ää on mielekästä käyttää vain serveripuolella. Tosin mikäli selain eli käyttäjäsovellus (UA) sitä tukee, systeemien testaus helpottuu. CSS on paljon tärkeämpi UA-puolella.
Huomautus 2. On muistettava, että eräät seikat ovat vielä keskeneräisiä, jolloin ne voivat muuttua. Tällöin selain voi tukea niitä viralliseen spesifikaatioon nähden epästandardilla tavalla. Tällä hetkellä on aivan mahdotonta, että olisi olemassa täysin XML-tason selain. Tosiasiassa selaimet ovat Working Draft -tasolla.
W3C: XML Linking Language (XLink), XSL Transformations Version 1.0 (XSLT), Schema Modules.
.