13 Nimiavaruudet Huomautus: Otsikon voisi kuvaavammin kirjoittaa muodossa "structdoc:section". Syy selviää piakkoin Merkkauksen ideana on helpottaa tiedon ja metatiedon erottelua tarjoamalla dokumenteille selkeä rakenne Esimerkki: kun teksti Leevi and the Leavings: Mitä kuuluu, Marja-Leena? Teuvo, maanteiden kuningas Mieletön Melinda kirjoitetaan muotoon (ja koodataan vähän lisätietoa) <RECORD AUTHOR="Leevi and the Leavings"> <ITEM LEN="3.42">Mitä kuuluu, Marja-Leena?</ITEM> <ITEM LEN="4.09">Teuvo, maanteiden kuningas</item> <ITEM LEN="3.14">Mieletön Melinda</ITEM> </RECORD> huomataan heti, mitä kirjoittaja ajaa takaa ja tarkoittaa. Vai huomataanko? 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 318
Ongelmaa syntyy, kun samoilla elementtien nimillä on useita järkeviä tulkintoja. Asiaa on hyvin vaikea välttää etukäteen Esimerkki: entäpä jos meillä olisi annettuna vielä toinenkin dokumentti: <RECORD AUTHOR="Matti Nykänen"> <ITEM LEN="80">pieni mäki</item> <ITEM LEN="245">lentomäki</ITEM> </RECORD> Mitäs nämä sitten tarkoittavat? Ilmeisestikin eri asioita kuin edellä, mutta millä se huomataan? Entäpä jos elementin ITEM sisältö olisi vielä erilainen? On suuri kiusaus sanoa, että dokumentit erotetaan niiden sisältämän tiedon perusteella. Tietokoneelle tehtävä on kuitenkin auttamattomasti liian vaikea, koska ihminenkään ei erottelua aina pysty tekemään Esimerkki: entäpä jos dokumentit pitäisi vielä syystä tai toisesta yhdistää? Olkoon siis dokumentti, joka listaa laulaja Matti Nykäsen kappaleita ja mäkihyppyennätyksiä. Mistä elementit ITEM nyt erotetaan? <RECORD AUTHOR="Matti Nykänen"> <ITEM LEN="80">pieni mäki</item> <ITEM LEN="3.42">Yllätysten yö</item> </RECORD> 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 319
Kurssin alkupuolella samantyyppiseen ongelmaan törmättiin HTMLelementtien semantiikan (ulkoasun näkökulmasta) kanssa: on tilanteita, jossa elementti P tarkoittaa yhtä ja toisaalla toista. Ongelma ratkaistiin CSSattribuutin CLASS avulla seuraavasti: <P CLASS="std">Tämä on tavallinen tekstikappale</p> <P CLASS="add">Tämä tekstikappale sisältää lisätietoja</p> XML ratkaisi kömpelön CLASS-attribuuttien käytön tarjoamalla mahdollisuuden omannimisten (-tyyppisten) elementtien määrittelyyn Edellä ongelma olisi siis voitu ratkaista XML:n avulla vaikkapa muodossa <stdp>tämä on tavallinen tekstikappale</stdp> <addp>tämä on erikoinen tekstikappale</addp> ts. kirjoittamalla kaikki tieto suoraan elementin nimeen. Tämä ei kuitenkaan poista ongelmaa, jossa eri kirjoittajat keksivät samannimisiä elementtejä (ja yhdistelevät elementtirakenteitaan) Edellä artisti-mäkihyppääjän tapauksessa ongelma voitaisiin yrittää ratkaista järkevästi keksimällä riittävän kuvaavia elementin nimiä, esim. tyyliin <SKIJUMPITEM LEN="80">pieni mäki</skijumpitem> <MUSICITEM LEN="3.42">Yllätysten yö</musicitem> 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 320
Periaatteessa ratkaisu on hyvä, mutta jäljelle jää vielä hankalia ongelmia: - täsmällisistä elementtien nimistä tulee helposti mahdottoman pitkiä (SKIJUMPITEMFOROSSINYKANENSAPPLICATIONATTUTINFINLAND) - ja silti vaarana on, että joku toinen ottaa käyttöön juuri saman elementin eri merkityksessä, koska nimeämiskäytäntöä ei hallinnoida keskitetysti XML-nimiavaruudet ([XML Namespaces]) periaatteessa ratkaisee em. ongelmat: 1) elementtien ja attribuuttien nimet nimetään yksikäsitteisesti mv. pitkien tunnistemerkkijonojen avulla (jotka juuri määrittävät nimiavaruuden), 2) nimiavaruudet annetaan erityisen attribuutin avulla, jonka tulkinta on kiinteä (xmlns), 3) pitkien nimien aiheuttamat hankaluudet pyritään minimoimaan ottamalla käyttöön nimille lyhennysmerkinnät (prefiksit) ja 4) tunnistemerkkijonojen hallinta sidotaan olemassa olevaan yksikäsitteiseen tiedon nimeämiskäytäntöön (URI) 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 321
XML-nimiavaruudet tarjoaa mahdollisuuden kiinnittää elementtien ja attribuuttien nimiin yksikäsitteisen nimilapun, jonka avulla kaikkien maailman elementtien ja attribuuttien nimien erottaminen toisistaan on mahdollista Esimerkki: XML-nimiavaruuksien käytön avulla ITEM-elementtien erottamisen ongelma ratkeaa nyt esim. muodossa (kun nimiavaruuksien merkitys sovitaan) <RECORD AUTHOR="Matti Nykänen"> <ITEM LEN="80" xmlns="http://www.rakdok.com/skijump/"> pieni mäki</item> <ITEM LEN="3.42" xmlns="http://www.rakdok.com/music/"> Yllätysten yö</item></record> Esimerkki: samaan päästään myös kvalifioitujen nimien ([qualified names]) prefiksikoodauksen avulla. Tällöin dokumentti tulee esim. muotoon <RECORD AUTHOR="Matti Nykänen" xmlns:ski="http://www.rakdok.com/skijump/" xmlns:music="http://www.rakdok.com/music/"> <ski:item LEN="80"> pieni mäki </ski:item> <music:item LEN="3.42">Yllätysten yö</music:item></record> Jos tarkkoja ollaan, tilanne attribuuttien suhteen jää nimiavaruuksien näkökulmasta vielä epäselväksi (aiheeseen palataan pian) 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 322
Peruskäsitteitä XML-nimiavaruudet tarjoaa siis keinon nimetä kokoelman elementtien ja attribuuttien nimiä jossakin sovelluksessa (dokumentissa). Näitä nimiä kutsutaan ko. sovelluksen sanastoksi ([vocabulary]) Esimerkki: seuraavan dokumentin sanasto on (EXAMPLE, TYPE, STRONG); samannimisten elementtien ja attribuuttien nimet osataan erottaa toisistaan <EXAMPLE TYPE="simple">Tämä on <STRONG/> tekstiä.</example> Ei-toivottua tilannetta, jossa kahden eri sanaston samoja sanoja käytetään eri merkityksessä kutsutaan törmäykseksi ([collision]) (edellä ITEMit törmäsivät) XML-nimiavaruudet -spesifikaation ([Namespaces in XML]) perusta käsittelee juuri sanastojen nimeämiskäytäntöä tavoitteena törmäysten välttäminen (ks. http://www.w3.org/tr/rec-xml-names/) XML-nimiavaruus ([XML Namespace]) on kokoelma sovelluksen elementtien ja attribuuttien niminä käytettäviä nimimerkkijonoja, joka identifioidaan URImerkkijonon avulla Nimiavaruuden nimi on sitä vastaavan URI-merkkijonon arvo 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 323
Esimerkki: asetetaan (oletus)nimiavaruus, jonka nimi on "http://www.tut.fi/" <EXAMPLE xmlns="http://www.tut.fi/"></example> Viittaukset nimiavaruuksiin ovat identtisiä mikäli niitä vastaavien nimiavaruuksien nimet ovat tavallisina merkkijonoina samoja URI-merkkijonoilla ei nimiavaruuksien niminä ole nimilappuna toimivan merkkijonon lisäksi muuta tulkintaa (ts. niiden ei esim. ole pakko viitata oikeisiin tiedostoihin verkossa, tms.) Esimerkki: seuraavat merkkijonot viittaavat WWW-selainten käytännön URLsemantiikan mukaisesti samaan HTML-dokumenttiin, mutta nimiavaruuksien yhteydessä tarkoittavat eri nimiavaruuksien nimiä matriisi.ee.tut.fi/hmopetus/ http://matriisi.ee.tut.fi/hmopetus/ Nimiavaruuksien sisältämät nimet esiintyvät XML-dokumenteissa jommassakummassa kahdesta perusmuodostaan: - kvalifioituna nimenä ([qualified name]) tai - lokaalina (kvalifioimattomana) nimenä (koostuen vain nimen lokaaliosasta [local name]) 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 324
Kvalifioitu nimi koostuu kahdesta kaksoispisteellä ":" erotetusta osasta: nimiavaruuden prefiksistä ja lokaaliosasta ([namespace prefix], [local part]) Esimerkki: kvalifioitu nimi elementin nimenä <ex:element>esimerkki</ex:element> Kvalifioidussa nimessä on aina täsmälleen yksi kaksoispiste ja se on ylläkuvatussa roolissa Huomaa, että XML 1.0 -spesifikaation näkökulmasta kvalifioitu nimi on tavallinen XML-nimi - ts. kaksoispisteellä ei XML 1.0:n näkökulmasta ole erityistä tulkintaa (joskaan kaksoispisteitä ei elementtien ja attribuuttien nimissä siis kannata käyttää, johtuen kaksoispisteen tulkinnasta nimiavaruuksien yhteydessä) Kvalifioidun nimen prefiksi, joka assosioidaan halutun URI-merkkijonon kanssa, valitsee nimiavaruuden Lokaali (kvalifioimaton) nimi sidotaan oletusnimiavaruuteen, perii vanhempansa nimiavaruuden tai ei kuulu mihinkään nimiavaruuteen Kvalifioidun nimen prefiksin (esim. ex) kiinnittäminen halutun nimiavaruuden kanssa suoritetaan xmlns-attribuutin avulla (esim. xmlns:ex="nimiavaruuden nimi") 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 325
Nimiavaruusjulistuksen perusteet: oletusnimiavaruudet Oletusnimiavaruus ([default namespace]) määritellään nimiavaruusjulistuksen ([namespace declaration]) avulla. Käytännössä nimiavaruusjulistus tehdään XML-dokumentin esiintymäosassa xmlns-attribuutin avulla. Esimerkki: valitaan nimiavaruus "http://matriisi.ee.tut.fi/hmopetus/" <EX xmlns="http://matriisi.ee.tut.fi/hmopetus"> <CONTENT ATTR="Attribuutilla ei oletuksena nimiavaruutta"> Elementin lapset perivät elementin oletusnimiavaruuden </CONTENT> </EX> Määrittelyn idea on edellä se, että attribuutti xmlns kertoo sen nimiavaruuden nimen, jonka sanastoon määrittelyn vaikutusalueella (määrittelyalueella [scope]) sijaitsevat elementit kuuluvat. Vaikutusalue selviää nimiavaruuden yksikäsitteisten periytymissääntöjen perusteella Koska nimiavaruuksien nimet ovat universaaleja (mikä siis on koko homman tavoite), ei pitäisi jäädä epäselvyyttä siitä, mikä on elementtien EX ja CONTENT rooli dokumentissa (ei törmäyksiä) 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 326
XML-nimiavaruudet -spesifikaatio ei kerro miten elementtien semantiikka tulee antaa, vaan osoittaa ainoastaan menetelmän jolla elementeille voidaan valita universaalit nimet. Dokumentin sanaston semantiikka voidaan kertoa esim. sanallisesti ja esimerkkien avulla URI-viittauksen päässä olevassa HTMLdokumentissa, mutta spesifikaatio ei tätä edellytä Edellinen yksinkertainen esimerkki on vain erikoistapaus nimiavaruuksien määrittelystä. Kirjataan esimerkistä joitain huomioita: - sanaston sanojen EX, CONTENT ja ATTR nimet ovat lokaaleja nimiä (ei kvalifioituja) - attribuutti xmlns asettaa oletusnimiavaruuden arvoksi "http://mat ". Nimiavaruus asetetaan elementin EX ja sen lapsielementtien nimiavaruudeksi - koska elementti CONTENT on EX:n sisällä elementti CONTENT perii oletusnimiavaruuden (mutta attribuutti ATTR ei, johtuen sovituista perintäsäännöistä) 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 327
Määrittely XML-nimiavaruudet -spesifikaatio määrittelee nimiavaruuksien käytön syntaktisen rakenteen EBNF-tuottosääntöjen muodossa (vrt. XML) Nimiavaruuksien spesifikaatio esittelee 18 tuottosääntöä, jotka yhdistetään XML 1.0 -spesifikaation kanssa Osa XML-nimiavaruudet -spesifikaation tuottosäännöistä jatkuu XMLspesifikaation tuottosääntöinä (joita ei esitellä uudelleen). Osa XMLnimiavaruudet -tuottosäännöistä taas päällekirjoittaa XML 1.0 -tuottosääntöjä, joten XML-nimiavaruudet tavallaan siis määrittää XML 1.0:n uudelleen! Ao. otteen numerointi seuraa spesifikaatiota [1] NSAttName ::= PrefixedAttName DefaultAttName [2] PrefixedAttName ::= 'xmlns:' NCName [ NSC: Leading "XML" ] [3] DefaultAttName ::= 'xmlns' [4] NCName ::= (Letter '_') (NCNameChar)* /* An XML Name, minus the ":" */ [5] NCNameChar ::= Letter Digit '.' '-' '_' CombiningChar Extender 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 328
Nimiavaruusjulistus annetaan siis tehtävään varatun NSAttName-muotoisen attribuutin avulla Tuottosääntöä PrefixedAttName ([2]) vastaavan attribuutin nimen osa NCName assosioidaan attribuutin arvoksi annettavaa nimiavaruuden nimeä vastaavan nimiavaruuden prefiksiksi ([namespace prefix]) (attribuutin arvo ei tällöin saa olla tyhjä) Nimiavaruuden nimen tulee olla URI-syntaksin mukainen merkkijono (Uniform Resource Identifier ks. esim. http://www.w3.org/addressing/). Nimi on siis pelkkä syntaktinen nimilappu jolla ei ole URIn semantiikkaa (siis ei tarvitse olla, joskin voi olla) Oletusnimiavaruuksien käyttäminen on siis vain yksi tapa, jolla sitoa elementin nimiavaruus. Toinen (monipuolisempi) tapa on tehdä se juuri nimiavaruuksien prefiksien avulla Esimerkki: valitaan nimiavaruus "http://matriisi.ee.tut.fi/" ja sille prefiksi ex <ex:example xmlns:ex="http://matriisi.ee.tut.fi/"> <ex:content ex:attr="nyt attribuutillakin on nimiavaruus"> CONTENT-elementin nimiavaruus määritelty ex-prefiksin avulla </ex:content> </ex:example> 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 329
Huomaa, että nimiavaruus ex otetaan käyttöön vasta kvalifioitujen elementtien ja attribuuttien nimien muodossa (xmlns:ex-julistus vain esittelee prefiksin) Nimiavaruuden prefiksiä ei ole pakko esitellä siinä elementissä, jossa prefiksiä käytetään, vaan määrittely voidaan antaa myös elementin vanhemmassa Esimerkki: nimiavaruudet ja niiden prefiksit <?xml version="1.0"?> <edi:x xmlns:edi="http://ecommerce.org/2004/edi-schema/"> <!-- edi-prefiksi viittaa nimiavaruuteen, jonka nimi on "http://ecommerce.org/2004/edi-schema/". Prefiksiä voidaan käyttää elementissä x ja kaikissa sen jälkeläisissä --> <edi:sub> <!-- nimiavaruus valittu edi-prefiksillä --> </edi:sub> <sub> <!-- nimiavaruus sama kuin edellisellä elementillä mutta nyt se on peritty elementiltä x --> </sub> <edi:sub xmlns:edi="http://www.foo.fi/"> <!-- edi-prefiksi viittaa tässä elementissä ja sen jälkeläisissä nimiavaruuteen, jonka nimi on "http://www.foo.fi/" --> </edi:sub> </edi:x> 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 330
Kvalifioitujen nimien käyttäminen mahdollistaa erityisesti: - nimiavaruudet attribuuteille (attribuuttien nimiavaruus määrätään aina prefiksien avulla) - merkintöjen sieventämisen, jos sisäkkäiset elementit viittaavat eri nimiavaruuksiin Attribuutit, joilla ei ole nimiavaruuden prefiksiä eivät kuulu mihinkään nimiavaruuteen Esimerkki: type-attribuutin nimiavaruuden määrittely <x xmlns:xlink="http://www.w3.org/1999/xlink"> x ei kuulu mihinkään nimiavaruuteen <sub xlink:type="simple">sub-elementillä ei nimiavaruutta</sub> </x> Nimiavaruusjulistus annetaan aina XML-dokumentin esiintymäosassa (DTD:ssä julistus voidaan tuottaa välillisesti antamalla attribuuteille oletusarvoja) Tuottosääntöä DefaultAttName ([3]) vastaavan attribuutin arvo valitsee oletusnimiavaruuden ([default namespace]). Tällöin attribuutin arvo voi olla myös tyhjä (mikä tarkoittaa sitä, että nimiavaruutta ei valita lainkaan) 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 331
Periytyminen, määrittelyalue ja attribuutit Nimiavaruus periytyy kvalifioimattomille elementeille Esimerkki: valitaan oletusnimiavaruudeksi "http://matriisi.ee.tut.fi/" <?xml version="1.0" encoding="iso-8859-1"?> <EXAMPLE xmlns="http://matriisi.ee.tut.fi/"> <CONTENT ATTR="attribuutilla ei nimiavaruutta"> <!-- CONTENT perii EXAMPLE:n nimiavaruuden --> <SUB xmlns=""> <!-- SUB ei kuulu mihinkään nimiavaruuteen... --> <ITEM> <!--... eikä ITEM siksi peri nimiavaruutta --> </ITEM> </SUB> </CONTENT> <ITEM> <!-- Tämä ITEM perii EXAMPLE:n nimiavaruuden --> </ITEM> </EXAMPLE> Kvalifioimattomien elementtien tapauksessa periytyminen on siis suoraviivaista: elementti perii vanhempansa nimiavaruuden ellei toisin mainita 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 332
Jos elementtejä kvalifioidaan, periytyminen on hieman monimutkaisempaa Esimerkki: valitaan oletusnimiavaruudeksi "http://matriisi.ee.tut.fi/" <?xml version="1.0" encoding="iso-8859-1"?> <EXAMPLE xmlns="http://matriisi.ee.tut.fi/" xmlns:foo="http://matriisi.ee.tut.fi/foo/" xmlns:zap="http:// matriisi.ee.tut.fi/zap/"> <foo:content attr="attribuutilla ei oletusnimiavaruutta"> <!-- CONTENT kuuluu foo-nimiavaruuteen --> <SUB xmlns=""> <!-- Tällä SUB:lla ei nimiavaruutta --> </SUB> <SUB zap:attr="attribuutti zap-nimiavaruudessa"> <!-- Tämä SUB perii EXAMPLE:n oletusnimiavaruuden --> </SUB> </foo:content> <ITEM foo:attr="attribuutti foo-nimiavaruudessa"> <!-- ITEM perii EXAMPLE:n oletusnimiavaruuden --> </ITEM> </EXAMPLE> Kuten edellisessä esimerkissä, nimiavaruuksien nimet ja niitä vastaavat kvalifioitujen nimien prefiksit yleensä samaistetaan kielenkäytössä 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 333
Elementin nimiavaruus määräytyy siis joko tämän kvalifioidun nimen, oletusnimiavaruuden tai jälkimmäisen perinnän perusteella Esimerkki: elementin ex nimiavaruuden asettaminen kahdella eri tavalla <!-- TAPA 1: oletusnimiavaruus --> <ex xmlns="http://www.rakdok.com/ex/"></ex> Nimiavaruudet <!-- TAPA 2: nimiavaruuden prefiksin julistus ja käyttö --> <myns:ex xmlns:myns="http://www.rakdok.com/ex/"></myns:ex> Nimiavaruus periytyy aina kvalifioimattomalle elementille tämän vanhemmilta (vanhemman [perimä] oletusnimiavaruus) ellei elementti itse aseta omaa oletusnimiavaruutta. Kvalifioitu elementti ei koskaan peri nimiavaruutta, vaan prefiksi kertoo sen. Attribuuteilla perintää ei tapahdu koskaan, vaan attribuutin nimiavaruus määräytyy aina kvalifioidun nimen perusteella Tyhjän oletusnimiavaruuden antamisella nimiavaruuksien vaikutus voidaan siis kytkeä pois päältä Oletusnimiavaruuksien avulla elementtejä voidaan sitoa nimiavaruuksiin ilman, että niiden nimet täytyy kirjoittaa kvalifioidussa muodossa (tästä on suurta hyötyä esim. DTD:n määrittelyn näkökulmasta) 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 334
Nimiavaruudet ja XML DTD: luvassa käytännön ongelmia Toistaiseksi nimiavaruuksien käsittelyn yhteydessä on puhuttu XMLdokumenteista mutta ei valideista XML-dokumenteista (ts. dokumenteista, jotka sisältävät dokumentin tyyppijulistuksen ja noudattavat sitä) Miten nimiavaruudet sitten pitää ottaa huomioon validien XML-dokumenttien suhteen? Vastaus: teoriassa ei mitenkään - kaikki XML DTD:stä tähän mennessä sanottu on sellaisenaan voimassa myös nimiavaruuksien suhteen! Tämä tarkoittaa seuraavaa: - nimiavaruudet ja DTD eivät yleensä ole käyttökelpoisia yhdessä - kvalifioidut nimet ovat XML 1.0-spesifikaation näkökulmasta tavallisia nimiä (nimiavaruuden ilmoittava prefiksi ja kaksoispiste on osa nimeä) - attribuutti xmlns on niinikään tavallinen attribuutti muiden joukossa (jonka järkevä tyyppi on yleensä CDATA) Seuraukset dokumenttien tyyppijulistusten näkökulmasta ovat selkeitä, mutta työläitä - jos nimiavaruuksia hyödyntävä dokumentti halutaan määrittää validiksi, pitää kaikki sallitut prefiksin käyttötavat esitellä DTD:ssä 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 335
Esimerkki: seuraava pieni validi XML-dokumentti havainnollistaa nimiavaruuksien ja XML DTD:n välistä suhdetta Nimiavaruudet <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE mydoc [ <!ELEMENT mydoc (foo:ex,zap:ex)> <!ELEMENT foo:ex (#PCDATA zap:ex ex)*> <!ELEMENT zap:ex (#PCDATA)> <!ELEMENT ex (#PCDATA)> <!ATTLIST mydoc xmlns:zap CDATA #IMPLIED xmlns:foo CDATA #IMPLIED> <!ATTLIST ex xmlns CDATA #IMPLIED> ]> <mydoc xmlns:zap="http://www.rakdok.com/zap/" xmlns:foo="http://www.rakdok.com/foo/"> <foo:ex><!-- kuuluu ex-nimiavaruuteen --> <zap:ex><!-- kuuluu zap-nimiavaruuteen --></zap:ex> <ex><!-- perii foo-nimiavaruuden --></ex> <ex xmlns="http://www.rakdok.com/other/"> <!-- kuuluu määrittelemäänsä oletusnimiavaruuteen --> </ex> <ex xmlns=""><!-- ei nimiavaruutta --></ex> </foo:ex> <zap:ex><!-- kuuluu zap-nimiavaruuteen --></zap:ex> </mydoc> 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 336
On kuitenkin erittäin todennäköistä, että tietty prefiksi halutaan aina sitoa tietyn nimiseen nimiavaruuteen. Tällöin prefiksin määräävä attribuuttilistan julistus on ilmeisen järkevää kiinnittää valmiiksi jo DTD:ssä Esimerkki: edellisessä esimerkissä olisi todennäköisesti perusteltua asettaa <!ATTLIST mydoc xmlns:zap CDATA #FIXED "http://www.rakdok.com/zap/" xmlns:foo CDATA #FIXED "http://www.rakdok.com/foo/"> Ilmeisesti tilanne on DTD:n näkökulmasta paljon yksinkertaisempi jos tyydytään käyttämään pelkkiä oletusnimiavaruusjulistuksia - tällöin hintana on kuitenkin se, että XML-prosessorin mahdollisuudet syntaktisten virheiden löytämiseen heikkenevät entisestään (edellä nimien ja nimiavaruuksien prefiksien väärinkäyttö olisi huomattu dokumenttia validoitaessa) Vakioarvojen pakottaminen on itse asiassa niin järkevää, että monet XMLnimiavaruuksia tukevat XML-jäsentimet tätä (vastoin XML-nimiavaruudet - spesifikaatiota) vaativatkin (esim. IE5 ja XML Spy) Tilanne on käytännössä todella ongelmallinen; mikäli sovelluksissa tarvitaan monipuolisesti nimiavaruuksia, on järkevämpää määritellä dokumenttiluokan looginen rakenne XML-skeeman avulla 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 337
Nimiavaruuksien käyttö edellyttää tietenkin että XML-prosessori osaa tulkita nimiavaruuksien semantiikan On erittäin tärkeätä huomata, että edellisissä esimerkeissä XML 1.0- spesifikaation näkökulmasta XML-nimiavaruuksien käsitteet kuuluvat XML 1.0:n ulkopuoliseen maailmaan (esim. "foo:ex" on vain elementin nimi siinä missä "mydoc" on elementin nimi) Erityisesti tämä tarkoittaa sitä, että joissain tilanteissa XML-nimiavaruuksien näkökulmasta kaksi eri XML 1.0:n nimeä tarkoittaa samaa asiaa (viittaavat saman sanaston samaan sanaan) Esimerkki: eri nimet mutta saman sanaston samat sanat <foo:ex xmlns:foo="http://www.rakdok.com/concept/"/> <zap:ex xmlns:zap="http://www.rakdok.com/concept/"/> Attribuuttien nimien suhteen tämä tarkoittaa sitä, että XML-kielioppia on sanastojen näkökulmasta mahdollista rikkoa ilman että XML 1.0 -prosessori tajuaa asiaa 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 338
Esimerkki: seuraavassa dokumentissa on virhe (sama attribuutti ei saa esiintyä alkutagissa kuin kerran) <foo:ex xmlns:foo="http://www.rakdok.com/concept/" xmlns:zap="http://www.rakdok.com/concept/" foo:attr="attribuutti ok" zap:attr="laiton attribuutti!"/> XML-dokumenttien prosessoinnin näkökulmasta XML-nimiavaruudet tuo mukanaan vielä lisää vaikeuksia: ei-validoiva XML-jäsennin kun ei välttämättä näe aina koko XML-dokumenttia (lähinnä ulkoisten tekstientiteettien tapaus ja attribuuteille annettavat oletusarvot DTD:ssä) - tällöin voi käydä niin, että esim. prefiksijulistus jää huomiotta ja tuloksena on laiton kvalifioitu nimi XML-nimiavaruuksia tukevat jäsentimet luonnollisestikin yrittävät tarjota ratkaisua ongelmaan Esitellään lopuksi XML-nimiavaruudet -spesifikaation tuottosäännöt. Seuraavat tuottosäännöt täsmentävät aikaisemmin esiteltyjä käsitteitä (kvalifioitu nimi) [6] QName ::= (Prefix ':')? LocalPart [7] Prefix ::= NCName [8] LocalPart ::= NCName 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 339
Kvalifioituja nimiä käytetään XML-nimiavaruuksien merkkausjulistuksessa kuten XML 1.0 -spesifikaation DTD:ssä (päällekkäisyys XML 1.0:n kanssa) [13] doctypedecl ::= '<!DOCTYPE' S QName (S ExternalID)? S? ('[' (markupdecl PEReference S)* ']' S?)? '>' [14] elementdecl ::= '<!ELEMENT' S QName S contentspec S? '>' [15] cp ::= (QName choice seq) ('?' '*' '+')? [16] Mixed ::= '(' S? '#PCDATA' (S? ' ' S? QName)* S? ')*' '(' S? '#PCDATA' S? ')' [17] AttlistDecl ::= '<!ATTLIST' S QName AttDef* S? '>' [18] AttDef ::= S (QName NSAttName) S AttType S DefaultDecl Kvalifioidut nimet vaikuttavat luonnollisesti merkkauksen kirjoittamiseenkin [9] STag ::= '<' QName (S Attribute)* S? '>' [10] ETag ::= '</' QName S? '>' [11] EmptyElemTag ::= '<' QName (S Attribute)* S? '/>' [12] Attribute ::= NSAttName Eq AttValue QName Eq AttValue [ NSC: Prefix Declared ] 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 340
Huomautuksia XML-nimiavaruudet on todella keskeinen spesifikaatio XML-stdperheessä: lähes kaikki muu rakentuu juuri uniikkien sanastojen idean varaan Ei ole yllättävää, että XML-nimiavaruudet -spesifikaation keskeisenä tavoitteena on, että käytettävien nimiavaruuksien nimet: 1) ovat ainutkertaisia ja pysyviä ja 2) ne omistaa niitä vastaavia URIa hallinnoiva taho Mikään virallinen taho ei tietenkään hallitse tätä (vielä?), vaan kyse on käytännöllisestä sopimuksesta ja uskottavuudesta Huomaa, että attribuutin xmlns nimen suhteen ei tapahdu törmäyksiä, koska xml-alkuiset nimet on varattu W3C:n omaan käyttöön XML-nimiavaruuksien oma nimiavaruus on oletusarvoisesti http://www.w3.org/xml/1998/namespace. Tämä sitoo automaattisesti kaikki xml-alkuiset nimet. Nimiavaruuden prefiksi pitää siis määritellä nimiavaruusjulistuksessa kaikille muille prefikseille paitsi merkkijonoille "xml" ja "xmlns" 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 341
XML 1.0 -spesifikaatio ei tunnista nimiavaruuksien olemassaoloa, mikä käytännössä näkyy ongelmina XML DTD -määrittelyissä (erityisesti prefiksien osalta). XML 1.0 -prosessori ei siis (välttämättä) tiedä nimiavaruuksista mitään, eikä siten myöskään löydä nimiavaruuksien käyttöön liittyviä virheitä Ikävien yllätysten välttämiseksi kannattaakin käyttää nimiavaruuksien prefikseinä aina spesifikaatioiden antamia esimerkkiprefiksejä, mikäli suinkin mahdollista (ts. jos tämä ei aiheuta törmäyksiä oman sanaston kanssa) Esimerkki: yksinkertainen XML-hypertekstilinkki määritellään tyypillisesti näin: <element xmlns:xlink="http://www.w3.org/1999/xlink"> <link xlink:type="simple" xlink:href="def.xml">määritelmä</link> </element> määrittely olisi kuitenkin voitu antaa yhtä hyvin esim. (identtisessä) muodossa (huonosti toteutettu XML-selain ei kuitenkaan nyt välttämättä huomaa linkkiä) <element xmlns:z="http://www.w3.org/1999/xlink"> <link z:type="simple" z:href="def.xml">määritelmä</link> </element> Esimerkin vaikutukset ovat selvät: linkit toteuttavan XML-prosessorin näkökulmasta on helpompaa etsiä avainsanoja xlink:type jne. kuin toteuttaa XML-nimiavaruudet -spesifikaatio (erityisesti kvalifioitujen nimien semantiikka) 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 342
XML-perusteet on käsitelty: mitäs seuraavaksi? Kun tarkoituksena on esitellä XML-standardiperhettä hypermedian näkökulmasta loogisessa järjestyksessä, olisi seuraavaksi toisen keskeisen spesifikaation, XPathin tarkan läpikäymisen vuoro. Kurssin aikataulu ei tähän mahdollisuuksia tarjoa, ikävä kyllä. Kurssin ideana on luoda tikapuut, kiivetä näillä tikapuilla talon katolle ja ihailla maisemaa. Jotta maisemasta ehdittäisiin kurssin puitteissa saada edes jonkinnäköinen aavistus, pitää tahtia jatkossa kiristää. Maiseman ihailuun nyt kannattaa tikapuiden jämäkkyyden kustannuksellakin ilmeisesti pyrkiä. Käytännössä tämä tarkoittaa sitä, että esityksen tarkkuudesta tingitään kurssin loppua kohden entistä enemmän. W3C:n XML-standardiperheeseen liittyvän suunnitelman näkökulmasta XMLnimiavaruudet ja XPath ovat vain välietappeja matkalla kohti edistyneempiä tavoitteita, kuten esim. XML-hypertekstiä (XLink) ja muunnoksia (XSLT). Tämä on suunta, johon useimmat XML-kehittäjät pyrkivät. Motivaationa on tyypillisesti hyvä hinta/laatu-suhde; käyttöön saadaan tätä kautta rikasta menetelmäkoneistoa suhteellisen vähäisellä tieto- ja työmäärällä. 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 343
Paljaan XML 1.0:n näkökulmasta toinen keskeinen looginen kehityksen suunta on kohti prosessoriohjelmointia. Tällöin ideana on kirjoittaa XML-dokumentteja käsittelevät (ja tulkitsevat) ohjelmat itse. Tähänkään työhön ei tarvitse ryhtyä puhtaalta pöydältä, sillä myös näitä menetelmiä on standardoitu ja jäsentimiin on tarjolla valmiita ohjelmointirajapintoja (vähentää uudelleenkeksimistä suuresti). Ao. kuva hahmottaa XML-soveltajan työn suuntia OMA PROSESSOINTI- TOTEUTUS (ESIM. SAX/DOM) MUUT RÄÄTÄLÖIDYT SOVELLUKSET VUOROVAIKUTUS XML LÄHDE- DOKU- MENTTI MUUNTAMI- NEN (XSLT) VIIMEISTELY (ESIM. CSS) XML KOHDE- DOKU- MENTTI VIIMEISTELY (ESIM. XSL-FO) KATSELEMINEN & NAVIGOIMINEN XML-STANDARDIEN MUKAISESTI OMAN RIIPPUMATTOMAN SOVELLUSKEHITYKSEN ALUE: SOVELLUKSET KIRJOITETAAN ITSE (JAVA, C++, VB, Perl, ). TYÖN TUKENA ESIMERKIT JA VALMIIT RAJAPINNAT XML-STANDARDIPERHEEN ALUE: KÄYTTÖSSÄ VALMIITA SOVELLUKSIA JA OHJELMISTOJA (ESIM. SELAIMET JA MUUT XML- JA XSLT-OHJELMISTOT) Visiot on taas visioitu. On aika jatkaa konkreettisempien asioiden käsittelyä 73275 RAKENTEISET DOKUMENTIT (kevät 2004) luentorunko ON & JH 344