XML-perusrakenteen ympärille on kehitetty tekniikoita ja standardeja kuvaamaan XML-rakenteisen tiedon käsittelyä sekä tietojen välisiä kytkentöjä. Näissä keskeinen tarve on pystyä osoittamaan operaatioiden tai kytkentöjen kohteet. on standardi, joka määrittelee tavan osoittaa kohteisiin valita kohteita :n määrittelemää osoittamistekniikkaa käytetään esim. XML Schema:ssa määrittelemään elementin tunnisteita ja niihin perustuvia viittauksia. XSLT:ssä ja XQuery:ssä valitsemaan operaatioiden kohteet XPointer ja XLink-standardeissa kytkentöjen osapuolten osoittamiseen 1 -standardista on 2 versiota: 1.0: 16 Nov 1999: http://www.w3.org/tr/xpath useat työkalut käyttävät yhä tätä 2.0: 23 Jan 2007: http://www.w3.org/tr/xpath20/ huomattavasti laajempi kuin edeltäjänsä eroja myös keskeisissä toiminnoissa - kuten oletusnimiavaruuden käsittelyssä Seuraavassa tarkastellaan aluksi 1.0:n piirteitä ja sen jälkeen 2.0:n lisäominaisuuksia 2 -valintalausekkeiden avulla osoitetaan jokin tai joitakin solmuja XML-puussa, esim. //rcp:ingredient [@amount='0.5' and @unit='cup']/@name valitsee kohteeksi attribuutin name arvot sellaisista reseptikokoelman (nimiavaruus rcp) reseptien raakaaineista, joita resepteissä on käytetty puoli kupillista. valintalauseke (location path) muodostuu sarjasta valinta-askeleita (location step) Kukin askel tuottaa tuloksenaan järjestetyn solmujoukon, ja seuraava askel jatkaa valintaa edellisen askelen tulosjoukosta eteenpäin soveltamalla seuraavaa valintaehtoa kukin tulosjoukon solmu vuorollaan lähtökohtana skeleiden erottimena kauttaviiva (/) Jos kauttaviiva aloittaa lausekkeen, lähdetään liikkeelle puun juuresta simerkkien kohteena M&S:. reseptikokoelma 3 4 Valinta-askeleen valintaehto on kolmiosainen haara :: solmu [ehtolauseke 1 ] [ehtolauseke N ] haara (axis) rajaa valinnan lähtösolmun suhteen määriteltävään osaan puuta solmu (node) rajaa valinnan tiettyyn solmutyyppiin ehtolausekkeet (0-n kpl) asettavat lisävaatimuksia valittaville solmuille. child::rcp:recipe[attribute::id='r123'] recipe-elementti lapsielementeistä jonka attribuutilla id on arvo r123 /descendant:: /descendant:: / child:: D lähtökohta Jos valintalauseke alkaa kauttaviivalla (/) on lähtökohtana puun juuri 5 6 1
Solmujen järjestys: järjestysnumerot esijärjestyksen mukaisesti 5 4 3 6 7 1 2 8 9 10 11 D esijärjestys: käsittele juuri käsittele alipuut vasemmalta oikealle Solmut tuloskokoelmaan järjestysnumeronsa mukaisessa järjestyksessä Haaroja: child: lähtösolmun lapsisolmut (ei attribuuttisolmuja) descendant: lähtösolmuun alipuissa olevat solmut (ei attribuuttisolmuja) parent: isäsolmu, juuren kohdalla tyhjä ancestor: polku isäsolmusta juureen following-sibling: oikeanpuoleiset velisolmut (ei attr.) following: järjestyksessä solmun jälkeen olevat poislukien solmun jälkeläiset preceding: järjestyksessä solmua edeltävät, poislukien esivanhemmat 7 8 Haaroja lähtö D D D parent:: descendant:: following-sibling:: lähtö lähtö lähtö D D D following:: ancestor:: preceding:: 9 Muita haaroja: preceding-sibling self descendant-or-self ancestor-or-self attribute: attribuuttisolmuihin ei pääse käsiksi muiden haarojen kautta. ttribuuttisolmu voi kuitenkin olla lähtökohtana parent ja ancestor haaroille. 10 Solmurajaus text(): valitsee tekstidata solmut comment(): valitsee kommenttisolmut processing-instruction(): käsittelyohjesolmut node(): kaikki solmutyypit *: jos haara on 'attribute' niin kaikki attribuuttisolmut, muuten kaikki elementtisolmut name: nimetyn tyyppiset *:localname: nimetyn tyyppiset nimiavaruudesta riippumatta prefix:* kaikki nimiavaruuteen 'prefix' kuuluvat Huom: 1.0:ssa tulkitaan nimiavaruutta siten, että ilman etuliitettä olevat kuuluvat 'tyhjään nimiavaruuteen', joka määritellään xlmns=""; simerkiksi XML Schema:ssa ilman etuliitettä olevat tulkitaan kuuluviksi oletusnimiavaruuteen. 2.0 käyttää myös tätä tulkintaa 11 12 2
htolausekkeet ovat -lausekkeita, jotka evaluoidaan totuusarvoiksi Voivat sisältää funktioita, muuttujia, vertailuja, versiossa 2.0 myös kontrollirakenteita kokonaisluku (esim. [1]): tosi, jos solmun järjestysnumero kokoelmassa on tuo kokonaisluku [position()=1] merkkijono: tosi, jos pituus>0 kokoelma: tosi, jos kokoelma ei ole tyhjä Usein ehtolausekkeena käytetään alipuuta (tai muuta ympäristöä) tutkivaa valintalauseketta reseptit, joiden raaka-aineena on käytetty sokeria: /descendant::rpc:recipe [descendant::rcp:ingredient[attribute::name='sugar']] tosi, jos ei tyhjä - kaikki sokerin käyttöä kuvaavat raaka-ainesolmut /descendant::rcp:recipe / descendant::rcp:ingredient[attribute::name='sugar'] ylemmässä yksi valinta-askel jälkimmäisessä 2 13 14 Xpath esimerkkejä ehtolausekkeet evaluoidaan esiintymisjärjestyksessään (yleensä tällä ei ole merkitystä) - seuraavassa esimerkissä kuitenkin on /descendant::rpc:ingredient[position()=3][position()=1] kolmas ingredient elementti /descendant::rpc:ingredient[position()=1][position()=3] tyhjä (yhden solmun kokoelmasta ei löydy kolmatta) Kuten valinta-askeleessakin on evaluonnissa lähtökohtana (kontekstina) vuorossaoleva tulosjoukon solmu /descendant::rcp:recipe/child::rcp:title kaikkien reseptien title-solmut /descendant::rcp:recipe/descendant::rcp:ingredient/ attribute::name jokaisen ingredient elementin name-attribuutttia vastaava solmu /descendant:rcp:*/child::text() kaikki puun tekstisolmut 15 16 esimerkkejä funktioita htolausekkeita [attribute::amount] elementillä on jokin arvo attribuutilla amount [attribute::name='sugar'] elementin attribuutilla name on merkkijonoarvo sugar [position()<5] viisi ensimmäistä [descendant::rpc:ingredient] liittyy vähintään yksi raaka-aine position(): paikka kokoelmassa last(): kokoelman viimeinen count(kokoelma): alkioiden lukumäärä /descendant::rcp:recipe[descendant::preparation [count(child::step)<5]] contains(string1,string2): tosi jos string1 sisältää string2:n /descendant::rcp:recipe[child::rcp:title='lehtipihvi'] /descendant::rcp:recipe[child::rcp:title[contains(text(),'pihvi')]] substring(string,start,len), upper-case, lowercase,round,ceiling, floor,. 17 18 3
lyhennemerkinnät lyhennemerkinnät :ssa on määritelty joukko lyhennemerkintöjä, joita käytetään yleisesti haaran oletusarvona on 'child', joten sen voi jättää pois /descendant::rcp:recipe/child::rcp:title => /descendant::rcp:recipe/rcp:title /descendant-or-self::node()/ voidaan korvata //:lla //rcp:recipe/rcp:title Mitä tuottaa tulokseksi //rcp:ingredient[1] 19 20 lyhennemerkinnät lyhennemerkinnät Mitä tuottaa tulokseksi //rcp:ingredient[1] ukikirjoitettuna /descendant-or-self::node()/child::rcp:ingredient [1] ensimmäinen askel valitsee kaikki puun solmut toinen askel valitsee recipe tai ingredient solmujen kohdalla niiden alapuolella olevat ingredient solmut ehtolauseke valitsee kustakin kokoelmasta ensimmäisen saadaan siis lista ensimmäisiä raaka-aineita /descendant::rcp:ingredient[1] attribute:: voidaan korvata merkillä @ /descendant::rcp:recipe / descendant::rcp:ingredient[attribute::name='sugar'] => //rcp:ingredient[@name='sugar'] parent::node() voidaan lyhentää '..' //rcp:nutrition[@calories=350]/../rcp:title 350 kilokaloristen reseptien title:t self::node() voidaan lyhentää '.' valitsee vain esijärjestyksessä ensimmäisen 21 22 2.0 2.0 2.0:ssa on 1.0:aan verrattuna lisäfunktioita, mm. palautettavien kokoelmien muokkaamiseen, funktioita on yleistetty Lisäoperaatioita (>>(seuraa),<< (edeltää),+,-,/, (vaihtoehtoisten polkujen yhdistäminen) operaatioiden evaluointitapa osittain muuttunut muuttujia toistolause ehtolause Muutamia funktioita: fn:doc(uri): lukee ulkoisen XML-tiedoston ja palauttaa sen juurielementin fn:distinct-values(kokoelma): palauttaa kokoelman erilaiset arvot vrt. SQL:n distinct fn:insert-before(kokoelma, kohta,kokoelma) lisää alkioita kokoelmaan fn:insert-before((1,3,5),2,(2,4)) =>(1,2,4,3,5) 23 24 4
2.0 2.0 for $muuttuja in lauseke return tulos for $r in //rcp:recipe return fn:count($r//rcp:ingredient[fn:not(rcp:ingredient)]) Kultakin reseptiltä lukumäärä perusraaka-aineista ts. sellaisista, jotka eivät koostu muista for-lauseita käytetään esim. Xquery-kielessä for-lauseet voivat olla sisäkkäisiä If (lauseke) then lauseke2 else lauseke2 fn:avg( for $r in //rcp:ingredient return if ($r/@unit= cup ) then xs:double($r/@amount)*237 else if ($r/@unit= teaspoon ) then xs:double($r/@amount)*5 else if ($r/@unit= tablepoon ) then xs:double($r/@amount)*15 else () ) Keskiarvo määristä millilitroiksi muunnettuna Tietotyyppimuunnos Vastaavia muillekin tyypeille 25 26 XML Schemassa XML Schemassa Viittaus elementtien välillä voidaan määritellä XML Schema:ssa käyttämällä ID ja IDR tietotyyppejä Viittaus perustuu aina yhteen attribuuttiin i voida määritellä, mihin kohteisiin on luvallista viitata Vaihtoehtoisena tapana tarjolla avaimiin (key) perustuva viittausmekanismi <element name="w:widget" xmlns:w="http://www.widget.org"> <complextype>... vaimena määriteltävän elementin </complextype> component alielementin part <key name="my_widget_key"> attribuutti manufacturer yhdessä <selector xpath="w:components/w:part"/> lielementin info attribuutin productid kanssa <field xpath="@manufacturer"/> <field xpath="w:info/@productid"/> </key> <keyref name="annotation_references" refer="w:my_widget_key"> <selector xpath=".//w:annotation"/> <field xpath="@manu"/> <field xpath="@prod"/> </keyref> </element> vaimeenviitataan alielementin annotationattribuuteilla manu ja prod 27 28 XML Schema:ssa ja XPointer <element name="collection"> <complextype> <sequence> <element name="description" type="string"/> <element ref="r:recipe" minoccurs="0" maxoccurs="unbounded"/> </sequence> </complextype> <unique name="recipe-id-uniqueness"> <selector xpath=".//r:recipe"/> <field xpath="@id"/> </unique> <keyref name="recipe-references" refer="r:recipe-id-uniqueness"> <selector xpath=".//r:related"/> <field xpath="@ref"/> </keyref> </element> XHTML standardissa dokumentin sisäisiin kohtiin voidaan osoittaa id-attribuutin arvon avulla http://dokuurl.html#id Tämä edellyttää, että paikkojen identifiointiin on käytetty id-attribuutteja ja ne ovat viittaajan tiedossa. XPointer on standardi, joka mahdollistaa monipuolisemman paikan osoittamisen dokumentin sisällä käyttämällä -polkuun perustuvaa viittaamista Reseptiesimerkissä ei käytetty ID ja IDR tietotyyppejä, vaan määriteltiin viittaukset unique-määreellä Unique kuten key, mutta eivät pakollisia 29 30 5
ja XPointer simerkiksi http://www.cs.helsinki.fi/u/laine/xml/k08/kurssikuvaus.shtml#xpointer (//h1) Viittaisi tämän kurssin sivuston kurssikuvauksen pääotsikkoon. Viittaus siis ilmaistaan polkumääreenä. Viittaus voi kohdistua useaan elementtiin...#xpointer(//img) Valitsee kaikki sivun kuvat #xpointer(//h3[text()= Tavoitteet ]) Valitsee kohdan, jossa tason 3 otsake on Tavoitteet 31 6