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.