Struktuursed andmed
XMLi hea omadus on, et selle abil kannatab mitmesuguse struktuuriga andmeid
hoida ja üle kanda. Andmeid tabelis hoides peab soovitavalt iga rea puhul
ühepalju veerge olema. Või kui eri ridade kohta erinev kogus andmeid teada, siis
tuleb tabelite puhul mitmesuguseid trikke välja mõelda, kuidas tulemus
mõistlikult hoida. XMLis aga saab viisakasti hoida kõike, mis on puukujulisse
struktuuri paigutatav. Ja mõningase mõtlemise peale saab puu kujule paigutada
pea kõik andmed.
Näitena ja päringute katsetamiseks sobib ette võtta sugupuu. Kirja saab panna
seda mitmel kujul, üks võimalik lahendus on allpool, kus igal inimesel on oma
isikuandmed. Lisaks sees element lapsed, kus üksteise järel kirjas lapsed ja
nende andmed. Ja nõnda üha sügavamale ja sügavamale. Niisama lihttekstina võib
suure suguvõsa korral tekst lugedes pikaks minna. Brauseri või mõne muu
vaatamisvahendi abil saab aga harusid kokku-lahku klõpsida ning vaid soovitud
koha välja võtta.
Aleksander
Kippar
1908
Pille
Kippar
1935
Jaagup
Kippar
1976
Toomas
Kippar
2008
Viivi
Laas
1939
Heli
Kiik
1964
Dorel
Kiik
1987
Grete
Kiik
1989
Liina
Jerkku
1970
Stenver
Jerkku
1990
Linnea
Jerkku
2003
Ehkki andmed on esiotsa puu kujul, saab sealt neid edaspidi sobivalt välja
võtta. Tahtes saada kogu puust kätte kõiki inimesi, piisab kui valikumustriks
kirjutada //inimene . Kaks kaldkriipsu mustri alguses ütleb, et vastava nimega
elementi tuleb otsida kogu andmepuu ulatuses. Parameeter xsl:sort for-each
tsükli sees määrab, et millise tunnuse alusel tuleb sisemised andmed järjestada.
Ja ongi inimesed sünniaastate järjekorras loetelus.
* Aleksander
* Pille
* Viivi
* Heli
* Liina
* Jaagup
* Dorel
* Grete
* Stenver
* Linnea
* Toomas
Puus allapoole saab ilusti elementide nimesid pidi küsida. Andmeid saab võtta
aga ka puust kõrgemalt poolt. Nõnda nagu failisüsteemis kataloogide vahel
liikudes saab kahe punktiga liikuda kõrgemale tasemele, nii saab ka XML
dokumendis kõrgema taseme elemente küsida kahe punkti abil. Tahtes konkreetse
inimese real küsida tema lapsevanema nime, tuleb avaldiseks ../../eesnimi . Ehk
siis esimesed kaks punkti viivad tagasi elemendi "lapsed" juurde, järgmised kaks
punkti ülemise "inimene" juurde. Ning sealt edasi juba võib otse eesnime küsida.
Tingimuslause if sellepärast juurde, et näidataks ainult neid inimesi loetelus,
kellel esivanema andmed teada. Kui test-atribuudis olev avaldis ei anna
väärtust, siis if-lause sisu ei täideta.
Ja nõnda saabki algsest andmepuust sobiva väljavõtte teha.
* Aleksander
* Pille - lapsevanem Aleksander
* Viivi - lapsevanem Aleksander
* Heli - lapsevanem Viivi
* Liina - lapsevanem Viivi
* Jaagup - lapsevanem Pille
* Dorel - lapsevanem Heli
* Grete - lapsevanem Heli
* Stenver - lapsevanem Liina
* Linnea - lapsevanem Liina
* Toomas - lapsevanem Jaagup
Siinses ringis võetakse ette kõik inimesed, kel lapsed on. Samuti: avaldis
//inimene[lapsed] annab välja ainult lastega inimesed. Sorteeritakse esimese
lapse sünniaasta järgi. Ehkki lapsed/inimene/synniaasta annab iseenesest kätte
kõikide laste sünniaastad. Kui aga küsitakse ainult ühte väärtust, siis antakse
välja esimene.
Et käänded paika saab, tuleb tingimuse juures kindlaks teha, mitu last kellelgi
on. Vastavalt sellele saab soovitud sõna kirjutada.
Ja jällegi vastused käes.
* Aleksander, 2 last
* Viivi, 2 last
* Pille, 1 laps
* Heli, 2 last
* Liina, 2 last
* Jaagup, 1 laps
Tsükli seest võib ka sissepoole edasi minna. Siinses näites võetakse kõigepealt
loetellu kõik andmepuus leiduvad lastega inimesed. Ning edasi loetletakse iga
inimese kohta kõik tema järglased. Avaldis lapsed//inimene
* Aleksander: Pille, Jaagup, Toomas, Viivi, Heli, Dorel, Grete, Liina,
Stenver, Linnea
* Pille: Jaagup, Toomas
* Jaagup: Toomas
* Viivi: Heli, Dorel, Grete, Liina, Stenver, Linnea
* Heli: Dorel, Grete
* Liina: Stenver, Linnea
Veebilehel tulevad andmed tavapäraselt HTMLiga kujundatult. Kui aga tahtmist
lihtsaid andmeid kätte saada, siis võib tulemuse ka otse XMLina välja näidata.
Järgnevas näites võetakse tsüklis ette kõik sugupuus leiduvad lastega inimesed,
paigutatakse loetellu üksteise järele ning igaühe elemendi sisse kopeeritakse
tema järetulijad. Käsklus xsl:copy-of kopeerib select-parameetrina ette antud
elemendi väärtuse väljundisse koos alanejatega.
Java puhul käib tulemusfaili kättesaamine sarnaselt eelnevatele näidetele.
ASP.NET puhul agai tuleb HTMLi osa aspx-failist välja võtta.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="sugupuu4.aspx.cs"
Inherits="sugupuu4" %>
Koodifaili on sobiv lisada lehe andmetüübiks "text/xml". Samuti tasub lisada
XML-faili algustunnus. Sellisel juhul tunneb veebilehitseja üldjuhul ära ja
suudab lasta mugavalt elemente kokku/lahti klõpsida.
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Xml.Xsl;
public partial class sugupuu4 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.ContentType = "text/xml";
Response.Write("");
}
}
Nagu tulemusest näha,
Aleksander
Pille
Kippar
1935
Jaagup
Kippar
1976
Toomas
Kippar
2008
Viivi
Laas
1939
...
Ülesandeid
* Koosta sarnane sugupuu ühest oma vanavanemast alates.
* Trüki välja kõikide inimeste sünniaastad.
* Väljastatakse nimed, kel on vähemalt kaks last.
* Väljasta sugupuus leiduvad andmed tabelina.
* Kus võimalik, seal väljasta tabelis iga inimese vanema nimi.
* Väljasta tabelis ka vanavanema nimi.
* Tabelisse paigutatakse vaid parameetriga ette antud perekonnanimega
inimesed.
* Väljasta iga inimese juures, mitmendal oma vanema sünniaastal ta sündis.
* Andmepuus muudetakse sünniaasta atribuudiks.
* Andmepuus lisatakse igale inimesele element, mille sisu koosneb eesnime
tähest, punktist ja perekonnanimest.
Osakond
* Koosta asutuse ühe osakonna kirjeldus ja andmed XML-ina. Nimetus,
eesmärgid, juhataja, töötajad. Iga inimese kohta vähemalt eesnimi,
perekonnanimi, amet ja palk.
* Väljasta XSLiga kõik ametid.
* Väljasta töötajate arv.
* Väljasta asjaajajate arv.
* Väljasta asjaajajad perekonnanimede järjekorras.
* Väljasta töötajad HTML-tabelina ameti järgi järjestatuna.
* Väljasta andmed eraldi XML-failina, kus on vaid ees- ja perekonnanimed
ning osakonna nimetus.
Asutus
* Kavanda suurema ettevõtte struktuur. Ettevõtte üksused paiknevad mitmes
linnas, igas neist võib olla mitu osakonda. Igas osakonnas hulk mitmesuguste
ametitega inimesi.
* Koosta XML-fail andmetega. Kiiremaks loomiseks saab elemente kopeerida.
* Loo XMLi põhjal XSLiga HTML-fail. Ettevõte ja üksused on pealkirjadena.
Iga osakonna inimeste kohta on HTML-tabel.
* Leia iga osakonna ning kogu ettevõtte töötajate arv.
* Koosta XSLiga eraldi XML-fail, kus on kirjas kõik sekretärid. Iga
sekretäri atribuudiks on tema telefoninumber.
* Teata parameetrina ette antud osakonna töötajate arv.
* Teata osakonnad, kus töötajaid on rohkem, kui parameetrina etteantud arv.