Meeskond "näljased": Difference between revisions

From ICO wiki
Jump to navigationJump to search
Ljogiste (talk | contribs)
Ljogiste (talk | contribs)
No edit summary
Line 9: Line 9:
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.  
*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:
***Meetodid:
public System.Collections.ObjectModel.Collection<Kategooria> kuvaKasutajaGrupid()- kuvab olemasolevad kasutajagrupid ja nende id-d.
**public System.Collections.ObjectModel.Collection<Kategooria> kuvaKasutajaGrupid()- kuvab olemasolevad kasutajagrupid ja nende id-d.
public string lisaKasutajagrupp()- lisab antud nimetusega kasutajagrupi
**public string lisaKasutajagrupp()- lisab antud nimetusega kasutajagrupi
public string kustutaKasutajagrupp()- kustutab antud ig-ga kasutajagrupi. Kui antud id-ga gruppi pole, siis annab exeptioni.
**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).
*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:
***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 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.
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.  
*Tooted. Kasutajatel (hetkel müüjal) on võimalus lisada ja kustutada tooteid toodete kategooriaid, hindu jms.  
Meetodid:
***Meetodid:
public System.Collections.ObjectModel.Collection<Toode> kuvaTooted()-kuvab kõik tooted
**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 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 string kustutaToode()- võimaldab kusutada antud ID-ga toote
**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 List<String> katToList()-teeb kasutajatest arraylisti
**public string kustutaKategooria()-kustutab antud id-ga kategooria. kontrollib, kas sellise id-ga kategooria on üldse olemas.
 
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.




Line 44: Line 37:
* 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.   
* 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:
***Meetodid:
public string logIn()- kontrollib kasutajanime ja parooli. Edukal sisselogimisel salvestab sessiooni andmebaasi ning määrab aegumisajaks hetkeaeg + 10 minutit.  
**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.
public void logOut()- kirjutab sessiooni aegumise aja üle hetkeajaga.


*Lisaks on veel hunnik abifunktsioone, näiteks parooli hashimine, väärtuste tagastamine jms.
*Lisaks on veel hunnik abifunktsioone, näiteks parooli hashimine, väärtuste tagastamine jms.
public string hash()- hashib ära parooli kasutades SHA1 algoritmi
**public string hash()- hashib ära parooli kasutades SHA1 algoritmi
 
**public bool kontrolliSessiooni()- vaatab, kas sessioon on aktiivne
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
private bool kontrolliOiguseid()- vaatab kas antud kasutajal on õigus soovitud toiminguid teha
**public int kysiKasutajagrupiID()- kasutajanimele vastava kasutajagrupi id küsimine tabelist kasutajagrupp
 
**private string kysiKasutajagrupinimetus()- kõikide kasutajagruppide nimetuste küsimiseks tabelist kasutajagrupp
enum Rollid- määratletakse kasutusel olevad rollinimed
**private string kysiKasutajanimi()-kõikide kasutajanimede küsimiseks tabelist kasutaja
 
**private int kysikasutajaIDsesioon()- kasutaja id küsimiseks tabelist sessioon
public int kysiKasutajagrupiID()- kasutajanimele vastava kasutajagrupi id küsimine tabelist kasutajagrupp
**private int kysiKasutajaID()- kasutaja id küsimiseks tabelist kasutaja
 
**private void salvestaSessioon()- sessiooni salvestamine andmebaasi
private string kysiKasutajagrupinimetus()- kõikide kasutajagruppide nimetuste küsimiseks tabelist kasutajagrupp
**public void uuendaSessiooni()- sessiooni uuendamine
 
**public bool kontrolliParool()- sisestatud parooli hashimine võrdlemine andmebaasis olevaga
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





Revision as of 19:31, 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.


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


[TeenuseSource]

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

Login Aken BackEnd

  • Klient

Source

3. Flickr API

Pilt

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>