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.