Meeskond "näljased": Difference between revisions
(16 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== 1. XML == | == 1. XML == | ||
XML-i tegime menüü kohta. XSLT faile on kaks: üks teeb XML-i HTML-i ning teine vahetab elementide ja atribuutide kohtad. XML faili kohta on olemas ka kirjeldav schema. Raskeimaks osaks oli elementidest atribuutide tegemine, asi küll toimis, kuid vormistus oli kole ning auklik. Schema vajas ka veidi harjumist, kuid kui asi käppa sai, siis läks imelihtsaks. | XML-i tegime menüü kohta. XSLT faile on kaks: üks teeb XML-i HTML-i ning teine vahetab elementide ja atribuutide kohtad. XML faili kohta on olemas ka kirjeldav schema. Raskeimaks osaks oli elementidest atribuutide tegemine, asi küll toimis, kuid vormistus oli kole ning auklik. Schema vajas ka veidi harjumist, kuid kui asi käppa sai, siis läks imelihtsaks. Koodi leiab lehe altosast. | ||
== 2. Teenus == | == 2. Teenus == | ||
Line 8: | Line 7: | ||
Võimalused alajaotuste kaupa: | Võimalused alajaotuste kaupa: | ||
*Kasutajagrupid:Hetkel on 3 kasutajagruppi: admin (saab teha kõike), müüja (saab teha kõike peale kasutajate ja kasutajagruppide loomise) ning tavakasutajad. On olemas eraldi funktsioon ka kasutajagruppide loomiseks. Iga meetodi käivitamisel kontrollitakse kasutajaõigusi. Ühel kasutajal saab olla mitu kasutajagruppi. | |||
*Kasutajad. Kasutajate loomiseks on 2 funktsiooni: üks tavakasutajate tegemiseks, mis ei eelda sisselogimist ning teine, mida saab teostada vaid administraator (ja lisada müüjaid või teisi administraatoreid). Kasutajate loomisel kontrollitakse seda, kas kasutajanimi on juba kasutusel. Kasutaja id ning roll sisestatakse ka tabelisse kasutajaRollis, mis näitab kasutajatel olevaid rolle. Kasutajate kustutamine käib otse andmebaasist. Kasutaja loomisel salvestatakse andmebaasi kasutaja parool hashitud kujul (algoritmiks sha1) | *'''Kasutajagrupid''':Hetkel on 3 kasutajagruppi: admin (saab teha kõike), müüja (saab teha kõike peale kasutajate ja kasutajagruppide loomise) ning tavakasutajad. On olemas eraldi funktsioon ka kasutajagruppide loomiseks. Iga meetodi käivitamisel kontrollitakse kasutajaõigusi. Ühel kasutajal saab olla mitu kasutajagruppi. | ||
*Tooted. Kasutajatel (hetkel müüjal) on võimalus lisada ja kustutada tooteid toodete kategooriaid, hindu jms. | ***Meetodid: | ||
*Sessioonid. Kasutaja edukal sisselogimisel luuakse unikaalne juhuslik sessiooni võti, mille olemasolu kontrollitakse iga sisselogimist eeldava meetodi käivitamisel. Session_key salvestatakse andmebaasis vastavas väljas. Eraldi on funktsioonid sessiooni olemasolu kontrollimiseks ning uuendamiseks. Hetkel on timeoudiks 10 minutit. Sessiooni kehtivust kontrollitakse ka kasutajaõiguste kontrollimisel. | **public System.Collections.ObjectModel.Collection<Kategooria> kuvaKasutajaGrupid()- kuvab olemasolevad kasutajagrupid ja nende id-d. | ||
* Logimine. Võrreldakse sisestatud kasjutajanime ning sisestatud parooli hashi andmebaasis olevatega. Kui need ühtivad, siis sisselogimine on edukas ning luuakse unikaalne session key, mis salvestatakse andmebaasi. Sisselogimine ning sessiooni olemasolu on eelduseks meetodite käivitamiseks. Kui sessioon aegub, siis toimub kasutaja väljalogimine. Väljalogimisfunktsioon kirjutab üle sessiooni aegumise aja, pannes selleks hetkelise kellaaja. | **public string lisaKasutajagrupp()- lisab antud nimetusega kasutajagrupi | ||
Lisaks on veel hunnik abifunktsioone, näiteks parooli hashimine, väärtuste tagastamine jms. | **public string kustutaKasutajagrupp()- kustutab antud ig-ga kasutajagrupi. Kui antud id-ga gruppi pole, siis annab exeptioni. | ||
*'''Kasutajad'''. Kasutajate loomiseks on 2 funktsiooni: üks tavakasutajate tegemiseks, mis ei eelda sisselogimist ning teine, mida saab teostada vaid administraator (ja lisada müüjaid või teisi administraatoreid). Kasutajate loomisel kontrollitakse seda, kas kasutajanimi on juba kasutusel. Kasutaja id ning roll sisestatakse ka tabelisse kasutajaRollis, mis näitab kasutajatel olevaid rolle. Kasutajate kustutamine käib otse andmebaasist. Kasutaja loomisel salvestatakse andmebaasi kasutaja parool hashitud kujul (algoritmiks sha1). | |||
***Meetodid: | |||
**public string looKasutaja()- Kastuamiseks administraatorile. Võimaldab luua uue kasutaja. Kontrollib kasutajanime olemasolu. Lisab kasutaja rolli id ja kasutaja id ka tabelisse kasutajaRollis. | |||
**public string looTavaKasutaja()- Võimaldab ilma sisselogimiseta luua tavakasutaja. Kasutaja rolliks määratakse automaatselt tavakasutaja. | |||
*'''Tooted'''. Kasutajatel (hetkel müüjal) on võimalus lisada ja kustutada tooteid toodete kategooriaid, hindu jms. | |||
***Meetodid: | |||
**public System.Collections.ObjectModel.Collection<Toode> kuvaTooted()-kuvab kõik tooted | |||
**public string lisaToode()- võimaldab lisada toote ning määrata sellele kategooria. | |||
**public string kustutaToode()- võimaldab kusutada antud ID-ga toote | |||
**public List<String> katToList()-teeb kasutajatest arraylisti | |||
**public System.Collections.ObjectModel.Collection<Kategooria> kuvaKategooriad()-kuvab kõik olemasolevad kategooriad ja nende id-d | |||
**public string lisaKategooria()- võimaldab lisada uue kategooria | |||
**public string kustutaKategooria()-kustutab antud id-ga kategooria. kontrollib, kas sellise id-ga kategooria on üldse olemas. | |||
*'''Sessioonid'''. Kasutaja edukal sisselogimisel luuakse unikaalne juhuslik sessiooni võti, mille olemasolu kontrollitakse iga sisselogimist eeldava meetodi käivitamisel. Session_key salvestatakse andmebaasis vastavas väljas. Eraldi on funktsioonid sessiooni olemasolu kontrollimiseks ning uuendamiseks. Hetkel on timeoudiks 10 minutit. Sessiooni kehtivust kontrollitakse ka kasutajaõiguste kontrollimisel. | |||
* '''Logimine'''. Võrreldakse sisestatud kasjutajanime ning sisestatud parooli hashi andmebaasis olevatega. Kui need ühtivad, siis sisselogimine on edukas ning luuakse unikaalne session key, mis salvestatakse andmebaasi. Sisselogimine ning sessiooni olemasolu on eelduseks meetodite käivitamiseks. Kui sessioon aegub, siis toimub kasutaja väljalogimine. Väljalogimisfunktsioon kirjutab üle sessiooni aegumise aja, pannes selleks hetkelise kellaaja. | |||
***Meetodid: | |||
**public string logIn()- kontrollib kasutajanime ja parooli. Edukal sisselogimisel salvestab sessiooni andmebaasi ning määrab aegumisajaks hetkeaeg + 10 minutit. | |||
**public void logOut()- kirjutab sessiooni aegumise aja üle hetkeajaga. | |||
*Lisaks on veel hunnik '''abifunktsioone''', näiteks parooli hashimine, väärtuste tagastamine jms. | |||
**public string hash()- hashib ära parooli kasutades SHA1 algoritmi | |||
**public bool kontrolliSessiooni()- vaatab, kas sessioon on aktiivne | |||
**private bool kontrolliOiguseid()- vaatab kas antud kasutajal on õigus soovitud toiminguid teha | |||
**enum Rollid- määratletakse kasutusel olevad rollinimed | |||
**public int kysiKasutajagrupiID()- kasutajanimele vastava kasutajagrupi id küsimine tabelist kasutajagrupp | |||
**private string kysiKasutajagrupinimetus()- kõikide kasutajagruppide nimetuste küsimiseks tabelist kasutajagrupp | |||
**private string kysiKasutajanimi()-kõikide kasutajanimede küsimiseks tabelist kasutaja | |||
**private int kysikasutajaIDsesioon()- kasutaja id küsimiseks tabelist sessioon | |||
**private int kysiKasutajaID()- kasutaja id küsimiseks tabelist kasutaja | |||
**private void salvestaSessioon()- sessiooni salvestamine andmebaasi | |||
**public void uuendaSessiooni()- sessiooni uuendamine | |||
**public bool kontrolliParool()- sisestatud parooli hashimine võrdlemine andmebaasis olevaga | |||
[[http://enos.itcollege.ee/~ljogiste/VR2/ TeenuseSource]] | |||
Klient on kirjutatud WPF-is ning hetkel on võimalik kuvada tooteid, kasutajaid, gruppe ning kasutajagruppe. | Klient on kirjutatud WPF-is ning hetkel on võimalik kuvada tooteid, kasutajaid, gruppe ning kasutajagruppe. | ||
Line 55: | Line 92: | ||
== XML == | == XML == | ||
<source lang="xml"> | |||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
Line 108: | Line 146: | ||
</magustoidud> | </magustoidud> | ||
</menyy> | </menyy> | ||
</source> | |||
== XSLT atribuutide tegemiseks elementidest == | == XSLT atribuutide tegemiseks elementidest == | ||
<source lang="xml"> | |||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | ||
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8"/> | <xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8"/> | ||
Line 139: | Line 180: | ||
</xsl:template> | </xsl:template> | ||
</xsl:stylesheet> | </xsl:stylesheet> | ||
</source> | |||
== XML schema == | == XML schema == | ||
<source lang="xml"> | |||
<?xml version="1.0" encoding="iso-8859-1" ?> | <?xml version="1.0" encoding="iso-8859-1" ?> | ||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> | <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||
Line 247: | Line 288: | ||
</xs:element> | </xs:element> | ||
</xs:schema> | </xs:schema> | ||
</source> | |||
== XSLT andmete kuvamiseks html-ina == | |||
<source lang="xml"> | |||
<?xml version="1.0" encoding="iso-8859-1"?> | |||
<xsl:stylesheet version="1.0" | |||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |||
<xsl:template match="/"> | |||
<html> | |||
<head> | |||
<!--<link rel="stylesheet" type="text/css" href="style.css" />--> | |||
</head> | |||
<body style="font-color: #D0D0D0;font-family:verdana;"> | |||
<h1>Menüü</h1> | |||
<h2 style="background-color:#77a1af; | |||
color: white; | |||
margin: 7px;">Pearoad</h2> | |||
<table border="0" width="400px"> | |||
<xsl:for-each select="menyy/pearoad/pearoog" > | |||
<tr > | |||
<td width="250px"> | |||
<xsl:value-of select="nimi" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
<td> | |||
<xsl:value-of select="hind" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
</tr> | |||
</xsl:for-each> | |||
</table> | |||
<h2 style="background-color:#c08e1d; | |||
color: white; | |||
margin: 7px;">Lisandid</h2> | |||
<table border="0" width="400px"> | |||
<xsl:for-each select="menyy/lisandid/lisand" > | |||
<tr > | |||
<td width="250px"> | |||
<xsl:value-of select="nimi" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
<td> | |||
<xsl:value-of select="hind" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
</tr> | |||
</xsl:for-each> | |||
</table> | |||
<h2 style="background-color:#c47121; | |||
color: white; | |||
margin: 7px;">Kuumad joogid</h2> | |||
<table border="0" width="400px"> | |||
<xsl:for-each select="menyy/joogid/soojad/soe" > | |||
<tr > | |||
<td width="250px"> | |||
<xsl:value-of select="nimi" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
<td> | |||
<xsl:value-of select="hind" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
</tr> | |||
</xsl:for-each> | |||
</table> | |||
<h2 style="background-color:#b03428; | |||
color: white; | |||
margin: 7px;">Külmad joogid</h2> | |||
<table border="0" width="400px"> | |||
<xsl:for-each select="menyy/joogid/kylmad/kylm" > | |||
<tr > | |||
<td width="250px"> | |||
<xsl:value-of select="nimi" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
<td> | |||
<xsl:value-of select="hind" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
</tr> | |||
</xsl:for-each> | |||
</table> | |||
<h2 style="background-color:#862419; | |||
color: white; | |||
margin: 7px;">Magustoidud</h2> | |||
<table border="0" width="400px"> | |||
<xsl:for-each select="menyy/magustoidud/magustoit" > | |||
<tr > | |||
<td width="250px"> | |||
<xsl:value-of select="nimi" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
<td> | |||
<xsl:value-of select="hind" /> | |||
<xsl:element name="br" /> | |||
</td> | |||
</tr> | |||
</xsl:for-each> | |||
</table> | |||
</body> | |||
</html> | |||
</xsl:template> | |||
</xsl:stylesheet> | |||
</source> |
Latest revision as of 19:34, 19 May 2010
1. XML
XML-i tegime menüü kohta. XSLT faile on kaks: üks teeb XML-i HTML-i ning teine vahetab elementide ja atribuutide kohtad. XML faili kohta on olemas ka kirjeldav schema. Raskeimaks osaks oli elementidest atribuutide tegemine, asi küll toimis, kuid vormistus oli kole ning auklik. Schema vajas ka veidi harjumist, kuid kui asi käppa sai, siis läks imelihtsaks. Koodi leiab lehe altosast.
2. Teenus
2.1 Teenus
Võimalused alajaotuste kaupa:
- Kasutajagrupid:Hetkel on 3 kasutajagruppi: admin (saab teha kõike), müüja (saab teha kõike peale kasutajate ja kasutajagruppide loomise) ning tavakasutajad. On olemas eraldi funktsioon ka kasutajagruppide loomiseks. Iga meetodi käivitamisel kontrollitakse kasutajaõigusi. Ühel kasutajal saab olla mitu kasutajagruppi.
- Meetodid:
- public System.Collections.ObjectModel.Collection<Kategooria> kuvaKasutajaGrupid()- kuvab olemasolevad kasutajagrupid ja nende id-d.
- public string lisaKasutajagrupp()- lisab antud nimetusega kasutajagrupi
- public string kustutaKasutajagrupp()- kustutab antud ig-ga kasutajagrupi. Kui antud id-ga gruppi pole, siis annab exeptioni.
- Kasutajad. Kasutajate loomiseks on 2 funktsiooni: üks tavakasutajate tegemiseks, mis ei eelda sisselogimist ning teine, mida saab teostada vaid administraator (ja lisada müüjaid või teisi administraatoreid). Kasutajate loomisel kontrollitakse seda, kas kasutajanimi on juba kasutusel. Kasutaja id ning roll sisestatakse ka tabelisse kasutajaRollis, mis näitab kasutajatel olevaid rolle. Kasutajate kustutamine käib otse andmebaasist. Kasutaja loomisel salvestatakse andmebaasi kasutaja parool hashitud kujul (algoritmiks sha1).
- Meetodid:
- public string looKasutaja()- Kastuamiseks administraatorile. Võimaldab luua uue kasutaja. Kontrollib kasutajanime olemasolu. Lisab kasutaja rolli id ja kasutaja id ka tabelisse kasutajaRollis.
- public string looTavaKasutaja()- Võimaldab ilma sisselogimiseta luua tavakasutaja. Kasutaja rolliks määratakse automaatselt tavakasutaja.
- Tooted. Kasutajatel (hetkel müüjal) on võimalus lisada ja kustutada tooteid toodete kategooriaid, hindu jms.
- Meetodid:
- public System.Collections.ObjectModel.Collection<Toode> kuvaTooted()-kuvab kõik tooted
- public string lisaToode()- võimaldab lisada toote ning määrata sellele kategooria.
- public string kustutaToode()- võimaldab kusutada antud ID-ga toote
- public List<String> katToList()-teeb kasutajatest arraylisti
- public System.Collections.ObjectModel.Collection<Kategooria> kuvaKategooriad()-kuvab kõik olemasolevad kategooriad ja nende id-d
- public string lisaKategooria()- võimaldab lisada uue kategooria
- public string kustutaKategooria()-kustutab antud id-ga kategooria. kontrollib, kas sellise id-ga kategooria on üldse olemas.
- Sessioonid. Kasutaja edukal sisselogimisel luuakse unikaalne juhuslik sessiooni võti, mille olemasolu kontrollitakse iga sisselogimist eeldava meetodi käivitamisel. Session_key salvestatakse andmebaasis vastavas väljas. Eraldi on funktsioonid sessiooni olemasolu kontrollimiseks ning uuendamiseks. Hetkel on timeoudiks 10 minutit. Sessiooni kehtivust kontrollitakse ka kasutajaõiguste kontrollimisel.
- Logimine. Võrreldakse sisestatud kasjutajanime ning sisestatud parooli hashi andmebaasis olevatega. Kui need ühtivad, siis sisselogimine on edukas ning luuakse unikaalne session key, mis salvestatakse andmebaasi. Sisselogimine ning sessiooni olemasolu on eelduseks meetodite käivitamiseks. Kui sessioon aegub, siis toimub kasutaja väljalogimine. Väljalogimisfunktsioon kirjutab üle sessiooni aegumise aja, pannes selleks hetkelise kellaaja.
- Meetodid:
- public string logIn()- kontrollib kasutajanime ja parooli. Edukal sisselogimisel salvestab sessiooni andmebaasi ning määrab aegumisajaks hetkeaeg + 10 minutit.
- public void logOut()- kirjutab sessiooni aegumise aja üle hetkeajaga.
- Lisaks on veel hunnik abifunktsioone, näiteks parooli hashimine, väärtuste tagastamine jms.
- public string hash()- hashib ära parooli kasutades SHA1 algoritmi
- public bool kontrolliSessiooni()- vaatab, kas sessioon on aktiivne
- private bool kontrolliOiguseid()- vaatab kas antud kasutajal on õigus soovitud toiminguid teha
- enum Rollid- määratletakse kasutusel olevad rollinimed
- public int kysiKasutajagrupiID()- kasutajanimele vastava kasutajagrupi id küsimine tabelist kasutajagrupp
- private string kysiKasutajagrupinimetus()- kõikide kasutajagruppide nimetuste küsimiseks tabelist kasutajagrupp
- private string kysiKasutajanimi()-kõikide kasutajanimede küsimiseks tabelist kasutaja
- private int kysikasutajaIDsesioon()- kasutaja id küsimiseks tabelist sessioon
- private int kysiKasutajaID()- kasutaja id küsimiseks tabelist kasutaja
- private void salvestaSessioon()- sessiooni salvestamine andmebaasi
- public void uuendaSessiooni()- sessiooni uuendamine
- public bool kontrolliParool()- sisestatud parooli hashimine võrdlemine andmebaasis olevaga
Klient on kirjutatud WPF-is ning hetkel on võimalik kuvada tooteid, kasutajaid, gruppe ning kasutajagruppe.
2.2 Menüü teenuse klient
Et meie tore teenus oleks veidi rohkem käega katsutavam, sai külge tehtud ka klient, mis realiseeriks põhifunktsioone. Kliendiks on WPF rakendus ning funktsionaalsus on järgmine:
- Sisse logimine: rakenduse käivitamisel ahistatakse kasutajat sisselogimisaknaga, valede andmete korral saab kasutaja ilusa punase veateate. Õnnestumise korral genereeritakse sessioonivõti, ning kantakse teda pidevalt edasi.
- Toodete kuvamine,lisamine, kustutamine: kuvatakse väike popup, kus hunnik lahtreid ning kasutaja saab neid täites lisada toote. ID alusel saab kustutada ebasoovitava toote. Õnnestumisel või ebaõnnestumisel kuvatakse muidugi veateade.
- Kategooriate kuvamine, lisamine, kustutamine: iga toit tuleb paigutada kategooriasse, siin on koht kus neid luua saab. ID alusel jällegi kustutamine.
- Kasutajate kuvamine, lisamine: siin kuvatakse kõik süsteemis olevad kasutajad, ning toimub ka lisamine
- Kasutaja gruppide kuvamine (kustutamine): kuvatakse kehtivad kasutaja grupid, meetod ka kustutamiseks
- Pildid
- Klient
3. Flickr API
Võimalused alajaotuste kaupa:
- Pildiotsing: Kasutajal on võimalus otsida otsingusõna järgi pilte Flickri pildibaasist. Pilte otsitakse kasutajate galeriidest, pildikomplektidest ja niisama üles laetud piltidest, mis on publicud ehk avalikud. Kui kasutaja sisestab vähem kui 2 tähte, kuvatakse veateade. See on Flickri poolt samuti kinni keeratud, et ühetähe otsinguid ei teostataks. Üldjoontes ei oleks sellel ka mingisugust mõtet. Otsingusõna sisestamisel kuvatakse paremale aknasse 5 pildi thumbnaili, mis on kõige värskemad. Thumbnailidest vasakul all nurgas kuvatakse, mitu lehekülge pilte leiti ja mitmendal leheküljel parasjagu ollakse. Olles esimesel lehel ja/või teostades esimest otsingut, nuppu "eelmine" ei kuvata. Seejärel saab kasutaja hakata navigeerima lehekülgedel "eelmine" ja "järgmine" nuppudega. Valides thumbnaili välja ja klikkides selle peale, kuvatakse pilt suurena, laiusega 380 pikslit ja kõrgusega 380 pikslit. Kui suur pilt on kuvatud, avaneb ka võimalus vajutada nuppu "Ava kasutaja profiil". Sellega pääseb API kasutaja ligi suure pildi kasutaja profiilile. See on sobilik näiteks kui API kasutajale hakkas huvi pakkuma pildi üles laadinud kasutaja, ning soovib tema teisigi pilte sirvida.
- Inimese otsing: Kasutajal on võimalus otsida emaili järgi Flickri kasutajaid. Otsingulahtrisse mitte millegi sisestamisel või jättes sisestamata "@" sümbol, kuvatakse veateade. Vastasel korral kuvatakse kas kasutaja Flickri kasutajanimi, pärisnimi (kui see on tal määratud) ja tema profiili URL. Kui kasutaja on leitud, kuvatakse ka nuppu "Ava veebisait", millega pääseb kasutaja ligi ka tema profiilile, kirjutamata ise midagi veebibrauseri aknasse. Kui kasutajat ei leitud, antakse ka vastav veateade.
- Fotokomplektide kuvamine: Kasutaja saab vaadata oma fotokomplekte. Selleks tuleb kõigepealt vastava nupuga omandad frob, mis on Flickri API ajutine kood (kehtib ühe tunni). Kui frob on omandatud, avaneb kasutajale nupp "omanda token". Tokeniga on Flickri poolne frobi teisendus tokeniks, mida kasutatakse edaspidi kasutaja identifitseerimiseks. Kui token on omandatud, kuvatakse teade "token omandatud" või vastasel juhul "token omandamata". Seejärel ilmub nähtavale nupp "tiri fotosetid". Sellele klikkides kuvatakse thumbnailidena kasutaja fotokomplektid.
- Piltide üleslaadimine: Kõigepealt tuleb omandada frob ja token, nagu eelnevas punktis kirjeldatud. Seejärel saab kasutaja üles laadida oma pilte arvutist OpenFileDialogi abil. Seejärel saab sisestada pildile tiitli ehk nime, kirjelduse ja tagi, mida aga ei pea tegema (Flickr samuti ei nõua nende atribuutide olemasolu). Olles salvestanud atribuudid ilmneb nupp "lae üles". Sellele vajutades laetakse pilt kasutaja üldpiltide sekka üles.
Klient, installer ja lähtekood: Download
XML
<?xml version="1.0" encoding="UTF-8"?>
<menyy xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="menyy_schema.xsd">
<pearoad>
<pearoog>
<nimi>Seapraad</nimi>
<hind>23</hind>
</pearoog>
<pearoog>
<nimi>Kotlett</nimi>
<hind>42</hind>
</pearoog>
</pearoad>
<lisandid>
<lisand>
<nimi>Riis</nimi>
<hind>7</hind>
</lisand>
<lisand>
<nimi>kartul</nimi>
<hind>10</hind>
</lisand>
</lisandid>
<joogid>
<soojad>
<soe>
<nimi>Kohv</nimi>
<hind>10</hind>
</soe>
<soe>
<nimi>Tee</nimi>
<hind>15</hind>
</soe>
</soojad>
<kylmad>
<kylm>
<nimi>Morss</nimi>
<hind>23</hind>
</kylm>
<kylm>
<nimi>Vesi</nimi>
<hind>3</hind>
</kylm>
</kylmad>
</joogid>
<magustoidud>
<magustoit>
<nimi>Kisell</nimi>
<hind>14</hind>
</magustoit>
</magustoidud>
</menyy>
XSLT atribuutide tegemiseks elementidest
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8"/>
<xsl:template match="*[*]">
<xsl:choose>
<xsl:when test="not(@*)">
<xsl:copy>
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="not(*) and not(@*) ">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
XML schema
<?xml version="1.0" encoding="iso-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- definition of simple elements -->
<xs:element name="nimi" type="xs:string"/>
<xs:element name="hind" type="xs:decimal"/>
<!-- definition of complex elements -->
<xs:element name="menyy">
<xs:complexType>
<xs:sequence>
<xs:element ref="pearoad"/>
<xs:element ref="lisandid"/>
<xs:element ref="joogid"/>
<xs:element ref="magustoidud"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pearoad">
<xs:complexType>
<xs:sequence>
<xs:element ref="pearoog"/>
<xs:element ref="pearoog"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pearoog">
<xs:complexType>
<xs:sequence>
<xs:element ref="nimi"/>
<xs:element ref="hind" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="lisandid">
<xs:complexType>
<xs:sequence>
<xs:element ref="lisand"/>
<xs:element ref="lisand"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="lisand">
<xs:complexType>
<xs:sequence>
<xs:element ref="nimi"/>
<xs:element ref="hind" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="joogid">
<xs:complexType>
<xs:sequence>
<xs:element ref="soojad"/>
<xs:element ref="kylmad"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="soojad">
<xs:complexType>
<xs:sequence>
<xs:element ref="soe"/>
<xs:element ref="soe"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="kylmad">
<xs:complexType>
<xs:sequence>
<xs:element ref="kylm"/>
<xs:element ref="kylm"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="kylm">
<xs:complexType>
<xs:sequence>
<xs:element ref="nimi"/>
<xs:element ref="hind" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="soe">
<xs:complexType>
<xs:sequence>
<xs:element ref="nimi"/>
<xs:element ref="hind" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="magustoidud">
<xs:complexType>
<xs:sequence>
<xs:element ref="magustoit"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="magustoit">
<xs:complexType>
<xs:sequence>
<xs:element ref="nimi"/>
<xs:element ref="hind" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSLT andmete kuvamiseks html-ina
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<!--<link rel="stylesheet" type="text/css" href="style.css" />-->
</head>
<body style="font-color: #D0D0D0;font-family:verdana;">
<h1>Menüü</h1>
<h2 style="background-color:#77a1af;
color: white;
margin: 7px;">Pearoad</h2>
<table border="0" width="400px">
<xsl:for-each select="menyy/pearoad/pearoog" >
<tr >
<td width="250px">
<xsl:value-of select="nimi" />
<xsl:element name="br" />
</td>
<td>
<xsl:value-of select="hind" />
<xsl:element name="br" />
</td>
</tr>
</xsl:for-each>
</table>
<h2 style="background-color:#c08e1d;
color: white;
margin: 7px;">Lisandid</h2>
<table border="0" width="400px">
<xsl:for-each select="menyy/lisandid/lisand" >
<tr >
<td width="250px">
<xsl:value-of select="nimi" />
<xsl:element name="br" />
</td>
<td>
<xsl:value-of select="hind" />
<xsl:element name="br" />
</td>
</tr>
</xsl:for-each>
</table>
<h2 style="background-color:#c47121;
color: white;
margin: 7px;">Kuumad joogid</h2>
<table border="0" width="400px">
<xsl:for-each select="menyy/joogid/soojad/soe" >
<tr >
<td width="250px">
<xsl:value-of select="nimi" />
<xsl:element name="br" />
</td>
<td>
<xsl:value-of select="hind" />
<xsl:element name="br" />
</td>
</tr>
</xsl:for-each>
</table>
<h2 style="background-color:#b03428;
color: white;
margin: 7px;">Külmad joogid</h2>
<table border="0" width="400px">
<xsl:for-each select="menyy/joogid/kylmad/kylm" >
<tr >
<td width="250px">
<xsl:value-of select="nimi" />
<xsl:element name="br" />
</td>
<td>
<xsl:value-of select="hind" />
<xsl:element name="br" />
</td>
</tr>
</xsl:for-each>
</table>
<h2 style="background-color:#862419;
color: white;
margin: 7px;">Magustoidud</h2>
<table border="0" width="400px">
<xsl:for-each select="menyy/magustoidud/magustoit" >
<tr >
<td width="250px">
<xsl:value-of select="nimi" />
<xsl:element name="br" />
</td>
<td>
<xsl:value-of select="hind" />
<xsl:element name="br" />
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>