RaamatuRiiul: Difference between revisions

From ICO wiki
Jump to navigationJump to search
 
(54 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:Programmeerimine CSharp keeles]]
[[Category:Võrgurakendused II: hajussüsteemide ehitamine]]


= Rühmatöö aines Programmeerimine C# keeles =
= Rühmatöö aines Võrgurakendused II: hajussüsteemide ehitamine =
 
'''Versioonihaldus:'''
*https://raamatriiul.visualstudio.com/RaamatuRiiul
 
'''Klient rakendus ja veebiteenud'''
*https://www.dropbox.com/s/ugbvx4j4zdlbp68/RaamatuRiiul.7z?dl=0


== Meeskond ==
== Meeskond ==
Line 8: Line 14:
* Marite Rammo
* Marite Rammo


== Tehnoloogia ==
=Veebiteenus=
 
* C#
 
Otsustame ülejäänud hiljem
 
== Idee ==
== Idee ==


Projekti eesmärk on teha kooli infosüsteem. Alustame põhilistest asjadest ja lisame hiljem erinevaid funktsionaalsusi juurde. Teeme lille, mis on parem kui ÕIS. Esialgne projekti skelett on töölaua-põhine.
Tegu on online raamatupoega, kus müüakse kasutatud, kui ka uusi raamatuid. Admin lisab raamatud müüki ja klient saab neid osta.
 
 
''' Must have funktsionaalsus '''
 
*Ajakohane ja rühmapõhine maja/klasside tunniplaan.
*Ainetepõhine hinnete (k.a. jooksvad hinded) sisestamine.
*Õppejõud peab saama vastavalt enda vajadustele muudatusi sisse viia - programmi funktsionaalsus õppejõu seisukohalt.
*Tööde tähtaegade lisamine, õppematerjalid koondatud ühte kohta.
*Sisselogimine kasutaja ja parooliga.
*Õiguste jagamine (näiteks õppejõud saab vaadata ja muuta ainult oma aine(te) hindeid).
 
 
''' Nice to have funktsionaalsus '''
 
*Programmi funktsionaalsus õpilase seisukohalt (vaadata enda hindeid, kodutööde tähtaegu ja tunniplaani).
*ID-kaardi, Smart-ID, Mobiil-ID põhine autentimine.
*Ainetele registreerimise võimalus.
*Kasutaja andmete kuvamine ja muutmine
 
 
'''Versioonihaldus:'''
*https://lill.visualstudio.com/Lill
 
= Analüüs =


''' Mida meie projekt endas sisaldab? '''
== Funktsionaalsus ==


Kuna TTÜ Õppeinfosüsteem jätab soovida, tuli idee ise midagi paremat teha. Meie õppeinfosüsteemi põhikomponentideks on ajakohane ja informatiivne tunniplaan, õppematerjalide lisamise ja vaatamise võimalus ning jooksvate hinnete kuvamine. Ideaalis teeme nii tudengi kui õppejõu tüüpi kontodele vaated, kuid otsustasime põhirõhu õppejõu funktsionaalsusele seada.
'''Admin:'''
*Haldab tooteid
*Haldab tellimusi
*Haldab kategooriaid


''' Mis on meie rakenduse eesmärk? '''
'''Klient:'''
*Raamatute vaatamine
**Sorteerimissüsteem
**Lehitsemissüsteem
*Raamatute otsimine
**Nime järgi
**Kategooria järgi
**Autori järgi
**Kirjastuse järgi
*Raamatute tellimine
*Ostukorvi haldamine?


Eesmärk on koondada õppetööga seotud informatsioon ühte kohta ja teha see ligipääsetavaks nii õppejõule kui ka tudengile, lihtsustada õppejõu tööd ning koondada õppetööga seonduvate andmete jälgimine ning informatsiooni vahetamine tudengitega ühte keskkonda.
[[File:Raamatu_Riiul_DB_model.png]]


''' Mida tavakasutaja sellega teha saaks? '''
== XML ==


Meie rakenduse sihtkasutajateks on õppejõud ning tudengid. Tudengid saavad vaadata tunniplaani, tulevate kodutööde, kontrolltööde, eksamite ja ülesannete kuupäevi ning jooksvaid hindeid. Õppejõud saab lisaks vaatamisele teha vajalikke muudatusi.
XML osa tegime raamatute ja nendega seotud info kohta (hind, autorid, kategooria, lehtede arv jne).


''' Milliste osade realiseerimine võib osutuda problemaatiliseks? '''
'''XML andmefail'''
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<Books>
  <Book id="5" category="Ilukirjandus EestiKirjandus Ilukirjandus" language="Eesti">
    <BookPublisher>
      <PublisherName><![CDATA[Varrak]]></PublisherName>
    </BookPublisher>
    <BookName><![CDATA[Mürgiliblikas]]></BookName>
    <BookOverview>
      <![CDATA[Arvatavasti on paljud naised oma elus teda kohanud – kena, abivalmis, armastusväärset noorepoolset meest. Meest, kes oskab südantvõitvalt naeratada, kes üritab igapäevamuredes lohutust pakkuda ja sellega ükskõik kelle hallivõitu argielus kogunisti uue, särava lehekülje pöörata.
    Meest, kes oma päikeselise olemusega nii mõnegi abielus eevatütre võrdlema ja südant valutama, võibolla isegi kahetsema paneb, et tema abikaasa selline ei ole…
    Aga – kas ta on ikka niisugune, omakasupüüdmatult abivalmis? Võibolla on tegemist hoopis liblikapüüdjaga? Või on ta ise kirevalt kaunis liblikas? Äkki koguni salakaval mürgiliblikas?]]>
    </BookOverview>
    <Quality>5 - uus, heas korras</Quality>
    <Pages>240</Pages>
    <BookFormatEnum>
      <Id>1</Id>
      <Value>Standard</Value>
    </BookFormatEnum>
    <CoverEnum>
      <Id>1</Id>
      <Value>Hardcover</Value>
    </CoverEnum>
    <BookFullPrice currency="EUR">10.00</BookFullPrice>
    <BookDiscountedPrice currency="EUR">7.50</BookDiscountedPrice>
    <PlacePublished><![CDATA[Tallinn]]></PlacePublished>
    <YearPublished>2007</YearPublished>
    <BookQuantityInStock>2</BookQuantityInStock>
    <BookAuthors>
      <Author>
        <AuthorId>1</AuthorId>
        <AuthorName><![CDATA[Erik Tohvri]]></AuthorName>
        <OtherBooksByAuthor>
          <Book id="2" category="Ilukirjandus EestiKirjandus Romaan Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kaldaliiva]]></BookName>
            <BookPrice currency="EUR">8.50</BookPrice>
            <BookPages>245</BookPages>
            <BookYear>2005</BookYear>
            <BookQuantity>5</BookQuantity>
          </Book>
          <Book id="7" category="Ilukirjandus EestiKirjandus Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kodutute küla II: Sulasest sai peremees]]></BookName>
            <BookPrice currency="EUR">9.25</BookPrice>
            <BookPages>360</BookPages>
            <BookYear>2008</BookYear>
            <BookQuantity>1</BookQuantity>
          </Book>
        </OtherBooksByAuthor>
      </Author>
    </BookAuthors>
    <BookDiscount>
      <BookDiscountId>1</BookDiscountId>
      <BookDiscountName><![CDATA[Lõpumüük]]></BookDiscountName>
      <BookDiscountPrice currency="EUR">7.50</BookDiscountPrice>
      <BookDiscountStart>2018-05-23</BookDiscountStart>
      <BookDiscountEnd>2018-06-23</BookDiscountEnd>
    </BookDiscount>
    <CategoryDiscounts>
      <CategoryDiscount>
        <CategoryDiscountId>1</CategoryDiscountId>
        <CategoryDiscountName><![CDATA[Enne suve Eesti kirjanduse hinnad saledaks]]></CategoryDiscountName>
        <CategoryDiscountPercent>15.00</CategoryDiscountPercent>
        <CategoryDiscountStart>2018-05-01</CategoryDiscountStart>
        <CategoryDiscountEnd>2018-06-01</CategoryDiscountEnd>
      </CategoryDiscount>
    </CategoryDiscounts>
  </Book>
  <Book id="4" category="Romaan Mirabilia Väliskirjandus" language="Eesti">
    <BookPublisher>
      <PublisherName><![CDATA[Eesti Raamat]]></PublisherName>
    </BookPublisher>
    <BookName><![CDATA[Diraci meri]]></BookName>
    <BookOverview>
      <![CDATA[Plahvatuslaine viis laeva orbiidilt välja, kuid maandamisautomaat oli korras. Urmantsev sirutas käe välja ja kompis komandöri sidemes rinda. Too ei liigutanud end. Silmad lahti, vaatas ta koidutaevasse. Urmantsev kummardus tema kohale ja nägi, et pilkumatud silmad olid juba kaetud liivakorraga...
    Ta kaevas madala haua ja mattis nad siinsamas maha. Augu põhjas oli liiv niiske ja raske ning Urmantsev mõtles, et kuskil läheduses peab olema vesi.
    Hommik oli käes ja kohe hakkas idast puhuma kuiv kuum tuul. Laeva ümber laotus liivakõrb. See sarnanes vähe kõrbetega, mis olid Urmantsevile tuttavaid vaid raamatute kaudu. Tasane lausik väli, ei ühtegi barhaani ega küngast, ei mingit jälge mistahes taimestikust. Kõrvetavate päikesekiirte valguses äratas see maastik vaid nukrust ja igatsust.
    Ta torkas kepi lauatükikesega liivahunnikusse ja läks väsimusest tuikudes tagasi laeva. Paar lonksu puljongit tegid oma töö, ta oli täiesti rammestunud. Ta vajus istmele ja uinus. Ärkas alles õhtu eel.
    Jemtsevi ja Parnovi ulmeromaan «Diraci meri» on mitmeplaaniline teos, milles leidub kriminaalromaani elemente. Raamat pajatab täiesti fantastilisest avastusest -- isetäiustuvast ja iseprogrammeeruvast elektronmasinast, «mustast kastist» -- , nõukogude õpetlaste teaduslikest otsingutest, teadusliku uurimisinstituudi töötajatest, teadusliku avastuse kasutamise erinevatest võimalustest.
    Romaani autorid on otseselt seotud nüüdisaja teadusega, neid huvitavad teaduse progressi ja teadusliku otsingu suured perspektiivid. Nad tunnevad hästi kaasaegse teadusliku uurimisasutuse elu ja selles valdkonnas tegutsevaid inimesi. Kõigest sellest räägibki nende romaan «Diraci meri».]]>
    </BookOverview>
    <Quality>4 - kasutatud, kaaned ja nurgad kulunud</Quality>
    <Pages>288</Pages>
    <BookFormatEnum>
      <Id>1</Id>
      <Value>Standard</Value>
    </BookFormatEnum>
    <CoverEnum>
      <Id>2</Id>
      <Value>Paperback</Value>
    </CoverEnum>
    <BookFullPrice currency="EUR">4.25</BookFullPrice>
    <PlacePublished><![CDATA[Tallinn]]></PlacePublished>
    <YearPublished>1974</YearPublished>
    <BookQuantityInStock>3</BookQuantityInStock>
    <BookAuthors>
      <Author>
        <AuthorId>3</AuthorId>
        <AuthorName><![CDATA[Mihhail Jemtsev]]></AuthorName>
        <OtherBooksByAuthor>
          <Book id="9" category="Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Päikeseaas]]></BookName>
            <BookPrice currency="EUR">3.55</BookPrice>
            <BookPages>85</BookPages>
            <BookYear>2005</BookYear>
            <BookQuantity>1</BookQuantity>
          </Book>
          <Book id="9" category="Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kuukera]]></BookName>
            <BookPrice currency="EUR">3.20</BookPrice>
            <BookPages>78</BookPages>
            <BookYear>2006</BookYear>
            <BookQuantity>0</BookQuantity>
          </Book>
        </OtherBooksByAuthor>
      </Author>
      <Author>
        <AuthorId>9</AuthorId>
        <AuthorName><![CDATA[Jermei Parnov]]></AuthorName>
      </Author>
    </BookAuthors>
  </Book>
</Books>
</source>


Kõige problemaatilisemaks võib osutuda tunniplaani realiseerimine, kuna seal on väga palju erinevaid osi ning tegemist on meie rakenduse kõige mahukama osaga. Kalendri funktsionaalsus täies ulatuses, nii nagu meie seda ette kujutame, pakub kindlasti mitmekesiseid ja huvitavaid väljakutseid. Eriti raskeks võib osutuda sündmuste lisamine ja muutmine otse kalendrist.
'''XML skeemifail'''
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Books">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Book">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="BookPublisher">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="PublisherName" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="BookName" type="xs:string" />
              <xs:element name="BookOverview" type="xs:string" />
              <xs:element name="Quality" type="xs:string" />
              <xs:element name="Pages" type="xs:nonNegativeInteger" />
              <xs:element name="BookFormatEnum">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Id" type="xs:nonNegativeInteger" />
                    <xs:element name="Value" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="CoverEnum">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Id" type="xs:nonNegativeInteger" />
                    <xs:element name="Value" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="BookFullPrice">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="currency" type="xs:string" use="required" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="BookDiscountedPrice">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="currency" type="xs:string" use="required" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="PlacePublished" type="xs:string" />
              <xs:element name="YearPublished" type="xs:nonNegativeInteger" />
              <xs:element name="BookQuantityInStock" type="xs:nonNegativeInteger" />
              <xs:element name="BookAuthors">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="Author">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="AuthorId" type="xs:nonNegativeInteger" />
                          <xs:element name="AuthorName" type="xs:string" />
                          <xs:element minOccurs="0" name="OtherBooksByAuthor">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element maxOccurs="unbounded" name="Book">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="BookName" type="xs:string" />
                                      <xs:element name="BookPrice">
                                        <xs:complexType>
                                          <xs:simpleContent>
                                            <xs:extension base="xs:decimal">
                                              <xs:attribute name="currency" type="xs:string" use="required" />
                                            </xs:extension>
                                          </xs:simpleContent>
                                        </xs:complexType>
                                      </xs:element>
                                      <xs:element name="BookPages" type="xs:nonNegativeInteger" />
                                      <xs:element name="BookYear" type="xs:nonNegativeInteger" />
                                      <xs:element name="BookQuantity" type="xs:nonNegativeInteger" />
                                    </xs:sequence>
                                    <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
                                    <xs:attribute name="category" type="xs:string" use="required" />
                                    <xs:attribute name="language" type="xs:string" use="required" />
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="BookDiscount">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="BookDiscountId" type="xs:nonNegativeInteger" />
                    <xs:element name="BookDiscountName" type="xs:string" />
                    <xs:element name="BookDiscountPrice">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:decimal">
                            <xs:attribute name="currency" type="xs:string" use="required" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="BookDiscountStart" type="xs:date" />
                    <xs:element name="BookDiscountEnd" type="xs:date" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="CategoryDiscounts">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="CategoryDiscount">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="CategoryDiscountId" type="xs:nonNegativeInteger" />
                          <xs:element name="CategoryDiscountName" type="xs:string" />
                          <xs:element name="CategoryDiscountPercent" type="xs:decimal" />
                          <xs:element name="CategoryDiscountStart" type="xs:date" />
                          <xs:element name="CategoryDiscountEnd" type="xs:date" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
            <xs:attribute name="category" type="xs:string" use="required" />
            <xs:attribute name="language" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
</source>


''' Milline meie rakendus „välja näeb“? '''
'''XSLT to HTML'''
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="html" indent="yes"/>


Meie esileheks on üsna lihtsustatud sisselogimise leht. Seal on kasutajanime ja parooli lahter ning sisene nupp. Sisse logides suunatakse kasutaja tema tunniplaani lehele. Üleval ääres on menüü, kust saab valida tunniplaani, õppematerjalide ja hinnete vaatamise lehtede vahel.
  <xsl:template match="/Books">
    <html>
      <head>
        <title>Raamatud</title>
      </head>
      <body>
        <xsl:for-each select="Book" >
          <h1>
            "<xsl:value-of select="BookName"/>"
            <xsl:for-each select="BookAuthors/Author">
              <xsl:value-of select="AuthorName"/>
              <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
              </xsl:if>
            </xsl:for-each>
          </h1>
          <xsl:if test="BookDiscountedPrice">
            <strike>
              <xsl:value-of select="concat('Tavahind: ', BookFullPrice)"/>
            </strike>
            <xsl:value-of select="concat(' Soodushind: ', BookDiscountedPrice)"/>
          </xsl:if>
          <xsl:if test="not(BookDiscountedPrice)">
            <xsl:value-of select="concat('Hind: ', BookFullPrice)"/>
          </xsl:if>
          <br/>
          <xsl:value-of select="concat('Kirjastus: ', BookPublisher, ' ', YearPublished)"/>
          <br/>
          <xsl:value-of select="concat(Pages, ' lk')"/>
          <br/>
          <xsl:value-of select="concat('Kogus: ', BookQuantityInStock, ' tk')"/>
          <br/>
          <xsl:value-of select="concat('Seisukord: ', Quality)"/>
          <p>
            <xsl:value-of select="BookOverview"/>
          </p>
          <xsl:if test="count(BookAuthors/Author) > 1">
            <h3>Autorite teised raamatud: </h3>
          </xsl:if>
          <xsl:if test="count(BookAuthors/Author) = 1">
            <h3>Autori teised raamatud: </h3>
          </xsl:if>
          <ul>
            <xsl:for-each select="BookAuthors/Author">


''' Must have funktsionaalsus: '''
              <xsl:if test="count(OtherBooksByAuthor/Book) > 0">
                <li>
                  <h3>
                    <xsl:value-of select="AuthorName"/>
                  </h3>
                  <ul>
                    <xsl:for-each select="OtherBooksByAuthor/Book">
                      <xsl:if test="BookQuantity > 0">
                        <p>
                          <li>
                            <b>
                              "<xsl:value-of select="BookName"/>"
                            </b>
                            <xsl:value-of select="concat(' ', BookYear)"/>
                            <br/>
                            <xsl:value-of select="concat('Kategooriad: ', @category)"/>
                            <br/>
                            <xsl:value-of select="concat(BookPages, ' lk ')"/>
                            <br/>
                            <xsl:value-of select="concat('Kogus: ', BookQuantity, ' tk')"/>
                            <br/>
                            <xsl:value-of select="concat(BookPrice, ' ', BookPrice/@currency)"/>
                          </li>
                        </p>
                      </xsl:if>
                    </xsl:for-each>
                  </ul>
                </li>
              </xsl:if>
            </xsl:for-each>
          </ul>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
</source>


*Sisselogimine: Kontrollib, kas andmebaasis on vastav kasutaja, arvutab parooli räsi ja vaatab, kas sisestatud parooli räsi on õige või mitte. Taustal toimub kasutajagruppide ning õiguste majandus. Kui parool ja kasutajanimi ei klap, kuvatakse teade vastava sõnumiga.
*Tunniplaan: Vaikimisi kuvatakse kasutajaga seotud tunniplaani. Tunniplaani on võimalik vaadata nii kuu kui ka nädala lõikes ning kiirest saab valida soovitavat nädalat või kuud. Samuti on võimalik tunniplaani filtreerida kindlate tingimuste alusel (õppejõud, rühm, ruum jne). Õppejõul on lisaks vaatamisele ka õigus kalendrisse lisada, muuta ja kustutada erinevaid sündmusi. Süsteem kontrollib, kas antud ajal soovitud ruum on vaba, kui on tegu vastavat tüüpi sündmusega. Sündmustel on tüübid: Loeng, Praktikum, Harjutus, Konsultatsioon jne. Kalender kuvab samaaegselt ka koduste ülesannete ja tööde tähtaegu, mis ei pea omama kindlat kohta ja võivad kattuda teiste sündmustega.
*Õppematerjalid: Võimaldab õppejõul näha ning lisada, muuta ja kustutada õppematerjale failide või linkidena. Samuti on võimalik muuta materjalidele ligipääsemise õigusi kasutajagruppide kaupa (rühmad, õppeained jne).
*Hinded: Õppejõul võimalik valida vastav aine ning näha kõiki antud ainet õppivaid tudengeid ja nende jooksvaid hindeid. Peab olema võimalik lisada, muuta ja kustutada hinnete tulpasi (kontrolltööd, referaadid, laborid jne), [võimaluse korral ka VarChar tüüpi tulbad]. Lisaks sellele saab ridu nimede või hinnete (ka null) järgi filtreerida ning tudengitele hindeid määrata ja muuta. Kus sobilik, seal arvutatakse tudengi jooksvat seisu vastavalt õppejõu määratud kaaludele (protsentidele).


''' Nice to have funktsionaalsus: '''
'''XSLT to XML'''
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>


*Ligipääs õpilase tüüpi kontole: Kogu funktsionaalsus piiratud kujul ka tudengi tüüpi kontodele. Tudeng saab näha oma jooksvaid hindeid, registreeritud ainetega täidetud tunniplaani ning tunniplaanis on näha ka ülesannete tähtajad. Tudengil on ligipääs lubatud õppematerjalidele, ainult vaatamisõigus.
  <xsl:template match="/">
**Tudengi õppesoorituste info: Tudeng saab vaadata oma seni läbitud aineid ja nendes saadud hindeid. Lisaks näeb ka keskmist hinnet ning kogutud EAPsid.
    <xsl:element name="Books">
*Kasutaja andmete kuvamine ja muutmine: Igal kasutajal on infosüsteemis olemas „Minu andmed“ leht, kust saab muuta oma isikuandmeid (parooli, meiliaadressi, kodust aadressi, pilti jne) ning vaadata õpinguga seotud andmeid (õppekava, õppeaastat, rühma jne).
      <xsl:for-each select="/Books/Book">
*Teated: Teadete alt saab kasutaja saata kirja enda kooliga seotud inimestele. Võimalik saata ka õppeaasta või rühma alusel. Sealt alt näeb ka kõiki kasutajale saadetud teateid ning on võimalik neile vastata.
        <xsl:variable name="book" select="."/>
*Admin kasutaja liides: Kasutajaliides üldiste admin ülesannete tarbeks, nagu:
        <xsl:element name="Book">
**Uute kasutajate lisamine: Admini kasutaja alt on võimalik tudengeid ja õppejõude juurde lisada.
          <xsl:attribute name="id">
**Ainete lisamine: Uute õppeaindete lisamine süsteemi ning nende sidumine vastavate õppejõududega.
            <xsl:value-of select="@id"/>
*Ainetele registreerimine: Tudeng saab registreerida ennast õppeainetele ning näeb, palju EAPsid kokku valitud on. (Esialgu määrame tudengile ise tema õppeained ning õppejõule tema õpetatavad ained, tudeng ega õppejõud ise midagi kuskilt valida ei saa.)
          </xsl:attribute>
*Ühtse disainiga UI: Kasutatavuse eesmärgil oleks hea kui kõik erinevad alam-rakendused oleks sarnase stiili ja kujundusega.
          <xsl:element name="BookName">
*ID-kaardi, Smart-ID, Mobiil-ID põhine autentimine: Lisaks parooliga sisenemisele on kasutajal võimalik sisse logida ka ID-kaardi, Smart-ID või Mobiil-ID-ga. Tegemist pigem „Dream to have“ funktsionaalsusega ehk teeme selle, kui kõik muu on tehtud.
            <xsl:value-of select="BookName" />
          </xsl:element>
          <xsl:element name="Category">
            <xsl:value-of select="@category"/>
          </xsl:element>
          <xsl:element name="Language">
            <xsl:value-of select="@language"/>
          </xsl:element>
          <xsl:copy-of select="BookFullPrice"/>
          <xsl:copy-of select="BookDiscountedPrice"/>
          <xsl:copy-of select="BookPublisher"/>
          <xsl:element name="BookOverview">
            <xsl:value-of select="BookOverview"/>
          </xsl:element>
          <xsl:element name="Quality">
            <xsl:value-of select="Quality"/>
          </xsl:element>
          <xsl:element name="Pages">
            <xsl:value-of select="Pages"/>
          </xsl:element>
          <xsl:element name="BookFormat">
            <xsl:value-of select="BookFormatEnum/Value"/>
          </xsl:element>
          <xsl:element name="Cover">
            <xsl:value-of select="CoverEnum/Value"/>
          </xsl:element>
          <xsl:element name="Published">
            <xsl:value-of select="PlacePublished"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="YearPublished"/>
          </xsl:element>
          <xsl:if test="BookQuantityInStock &lt; 3">
            <xsl:element name="BookQuantityInStock">
              <xsl:value-of select="BookQuantityInStock"/>
            </xsl:element>
          </xsl:if>
          <xsl:element name="BookAuthors">
            <xsl:for-each select="$book/BookAuthors/Author">
              <xsl:variable name="author" select="."/>
              <xsl:element name="Author">
                <xsl:attribute name="id">
                  <xsl:value-of select="AuthorId"/>
                </xsl:attribute>
                <xsl:element name="AuthorName">
                  <xsl:value-of select="AuthorName"/>
                </xsl:element>
                <xsl:element name="OtherBooksByAuthor">
                  <xsl:for-each select="$author/OtherBooksByAuthor/Book">
                    <xsl:element name="Book">
                      <xsl:attribute name="id">
                        <xsl:value-of select="@id"/>
                      </xsl:attribute>
                      <xsl:element name="BookName">
                        <xsl:value-of select="BookName" />
                      </xsl:element>
                      <xsl:element name="Category">
                        <xsl:value-of select="@category"/>
                      </xsl:element>
                      <xsl:element name="Language">
                        <xsl:value-of select="@language"/>
                      </xsl:element>
                      <xsl:copy-of select="BookPrice"/>
                    </xsl:element>
                  </xsl:for-each>
                </xsl:element>
              </xsl:element>
            </xsl:for-each>
          </xsl:element>
        </xsl:element>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>
</source>


'''Tööjaotus'''
= Retsensioonid =


Esialgu jagame ära must have funktsionaalsuste tegemised. Tunniplaan on rakenduse kõige mahukam osa, seega tegelevad sellega kaks inimest – Alo ja Arnika, hinnete lehte teeb Marite, õppematerjalide lehte Sven ja sisselogimise leht on esialgu Karmeni teha. Kui tundub, et kellegi töömaht jääb teiste omast väiksemaks, siis saab alati tööjaotuse ümber teha nii, et aidatakse mahukamaid ülesandeid täitvaid meeskonnaliikmeid või otsustame lisada rakendusele mõne nice to have funktsionaalsustest.
'''Meie veebiteenuse, klientrakenduse ja XML retsensioon meeskonnale Miisiiks:''' [https://wiki.itcollege.ee/index.php/Talk:Miisiiks retsensioon]


= Ajalogi =
= Ajalogi =


* 11.09.2017 - meeskonna kokkupanek
*28.03.2018 - esimene kohtumine ja idee paika panemine, Wiki lehe tegemine, projekti analüüsi koostamine
* 19.10.2017 - esimene kohtumine ja idee paika panemine, Wiki lehe tegemine
*06.05.2018 - pühapäevasel hackatonil projekti arendamine
* 02.11.2017 - projekti analüüsi koostamine
*01.06.2018 - XML failide üles panemine Wiki lehele
* 09.11.2017 - analüüsi retsensioon
*03.06.2018 - retsensioonide üles panemine Wiki lehele
* 16.11.2017 - Seadsime üles projekti skeleti ja arutasime meile tehtud retsensiooni
* 12.12.2017 - meeskonnaga ülesannete täpsem üle vaatamine ja arutamine
* 18.12.2017 - prototüübi esitlemine ja tagasiside analüüsimine
* 06.01.2018 - kokkusaamine, arutasime edasiseid ülesandeid, tekkinud probleeme ja vaatasime üle tehtud töö
* 17.01.2018 - viimane kokkusaamine, probleemide lahendamine, viimaste tegemata asjade ülevaatamine
*18.01.2018 - lõpptoote kaitsmine

Latest revision as of 19:10, 6 June 2018


Rühmatöö aines Võrgurakendused II: hajussüsteemide ehitamine

Versioonihaldus:

Klient rakendus ja veebiteenud

Meeskond

  • Alo Avi - projektijuht
  • Arnika Rästa
  • Marite Rammo

Veebiteenus

Idee

Tegu on online raamatupoega, kus müüakse kasutatud, kui ka uusi raamatuid. Admin lisab raamatud müüki ja klient saab neid osta.

Funktsionaalsus

Admin:

  • Haldab tooteid
  • Haldab tellimusi
  • Haldab kategooriaid

Klient:

  • Raamatute vaatamine
    • Sorteerimissüsteem
    • Lehitsemissüsteem
  • Raamatute otsimine
    • Nime järgi
    • Kategooria järgi
    • Autori järgi
    • Kirjastuse järgi
  • Raamatute tellimine
  • Ostukorvi haldamine?

XML

XML osa tegime raamatute ja nendega seotud info kohta (hind, autorid, kategooria, lehtede arv jne).

XML andmefail

<?xml version="1.0" encoding="utf-8"?>
<Books>
  <Book id="5" category="Ilukirjandus EestiKirjandus Ilukirjandus" language="Eesti">
    <BookPublisher>
      <PublisherName><![CDATA[Varrak]]></PublisherName>
    </BookPublisher>
    <BookName><![CDATA[Mürgiliblikas]]></BookName>
    <BookOverview>
      <![CDATA[Arvatavasti on paljud naised oma elus teda kohanud – kena, abivalmis, armastusväärset noorepoolset meest. Meest, kes oskab südantvõitvalt naeratada, kes üritab igapäevamuredes lohutust pakkuda ja sellega ükskõik kelle hallivõitu argielus kogunisti uue, särava lehekülje pöörata. 
    Meest, kes oma päikeselise olemusega nii mõnegi abielus eevatütre võrdlema ja südant valutama, võibolla isegi kahetsema paneb, et tema abikaasa selline ei ole… 
    Aga – kas ta on ikka niisugune, omakasupüüdmatult abivalmis? Võibolla on tegemist hoopis liblikapüüdjaga? Või on ta ise kirevalt kaunis liblikas? Äkki koguni salakaval mürgiliblikas?]]>
    </BookOverview>
    <Quality>5 - uus, heas korras</Quality>
    <Pages>240</Pages>
    <BookFormatEnum>
      <Id>1</Id>
      <Value>Standard</Value>
    </BookFormatEnum>
    <CoverEnum>
      <Id>1</Id>
      <Value>Hardcover</Value>
    </CoverEnum>
    <BookFullPrice currency="EUR">10.00</BookFullPrice>
    <BookDiscountedPrice currency="EUR">7.50</BookDiscountedPrice>
    <PlacePublished><![CDATA[Tallinn]]></PlacePublished>
    <YearPublished>2007</YearPublished>
    <BookQuantityInStock>2</BookQuantityInStock>
    <BookAuthors>
      <Author>
        <AuthorId>1</AuthorId>
        <AuthorName><![CDATA[Erik Tohvri]]></AuthorName>
        <OtherBooksByAuthor>
          <Book id="2" category="Ilukirjandus EestiKirjandus Romaan Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kaldaliiva]]></BookName>
            <BookPrice currency="EUR">8.50</BookPrice>
            <BookPages>245</BookPages>
            <BookYear>2005</BookYear>
            <BookQuantity>5</BookQuantity>
          </Book>
          <Book id="7" category="Ilukirjandus EestiKirjandus Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kodutute küla II: Sulasest sai peremees]]></BookName>
            <BookPrice currency="EUR">9.25</BookPrice>
            <BookPages>360</BookPages>
            <BookYear>2008</BookYear>
            <BookQuantity>1</BookQuantity>
          </Book>
        </OtherBooksByAuthor>
      </Author>
    </BookAuthors>
    <BookDiscount>
      <BookDiscountId>1</BookDiscountId>
      <BookDiscountName><![CDATA[Lõpumüük]]></BookDiscountName>
      <BookDiscountPrice currency="EUR">7.50</BookDiscountPrice>
      <BookDiscountStart>2018-05-23</BookDiscountStart>
      <BookDiscountEnd>2018-06-23</BookDiscountEnd>
    </BookDiscount>
    <CategoryDiscounts>
      <CategoryDiscount>
        <CategoryDiscountId>1</CategoryDiscountId>
        <CategoryDiscountName><![CDATA[Enne suve Eesti kirjanduse hinnad saledaks]]></CategoryDiscountName>
        <CategoryDiscountPercent>15.00</CategoryDiscountPercent>
        <CategoryDiscountStart>2018-05-01</CategoryDiscountStart>
        <CategoryDiscountEnd>2018-06-01</CategoryDiscountEnd>
      </CategoryDiscount>
    </CategoryDiscounts>
  </Book>
  <Book id="4" category="Romaan Mirabilia Väliskirjandus" language="Eesti">
    <BookPublisher>
      <PublisherName><![CDATA[Eesti Raamat]]></PublisherName>
    </BookPublisher>
    <BookName><![CDATA[Diraci meri]]></BookName>
    <BookOverview>
      <![CDATA[Plahvatuslaine viis laeva orbiidilt välja, kuid maandamisautomaat oli korras. Urmantsev sirutas käe välja ja kompis komandöri sidemes rinda. Too ei liigutanud end. Silmad lahti, vaatas ta koidutaevasse. Urmantsev kummardus tema kohale ja nägi, et pilkumatud silmad olid juba kaetud liivakorraga... 
    Ta kaevas madala haua ja mattis nad siinsamas maha. Augu põhjas oli liiv niiske ja raske ning Urmantsev mõtles, et kuskil läheduses peab olema vesi. 
    Hommik oli käes ja kohe hakkas idast puhuma kuiv kuum tuul. Laeva ümber laotus liivakõrb. See sarnanes vähe kõrbetega, mis olid Urmantsevile tuttavaid vaid raamatute kaudu. Tasane lausik väli, ei ühtegi barhaani ega küngast, ei mingit jälge mistahes taimestikust. Kõrvetavate päikesekiirte valguses äratas see maastik vaid nukrust ja igatsust. 
    Ta torkas kepi lauatükikesega liivahunnikusse ja läks väsimusest tuikudes tagasi laeva. Paar lonksu puljongit tegid oma töö, ta oli täiesti rammestunud. Ta vajus istmele ja uinus. Ärkas alles õhtu eel. 
    Jemtsevi ja Parnovi ulmeromaan «Diraci meri» on mitmeplaaniline teos, milles leidub kriminaalromaani elemente. Raamat pajatab täiesti fantastilisest avastusest -- isetäiustuvast ja iseprogrammeeruvast elektronmasinast, «mustast kastist» -- , nõukogude õpetlaste teaduslikest otsingutest, teadusliku uurimisinstituudi töötajatest, teadusliku avastuse kasutamise erinevatest võimalustest. 
    Romaani autorid on otseselt seotud nüüdisaja teadusega, neid huvitavad teaduse progressi ja teadusliku otsingu suured perspektiivid. Nad tunnevad hästi kaasaegse teadusliku uurimisasutuse elu ja selles valdkonnas tegutsevaid inimesi. Kõigest sellest räägibki nende romaan «Diraci meri».]]>
    </BookOverview>
    <Quality>4 - kasutatud, kaaned ja nurgad kulunud</Quality>
    <Pages>288</Pages>
    <BookFormatEnum>
      <Id>1</Id>
      <Value>Standard</Value>
    </BookFormatEnum>
    <CoverEnum>
      <Id>2</Id>
      <Value>Paperback</Value>
    </CoverEnum>
    <BookFullPrice currency="EUR">4.25</BookFullPrice>
    <PlacePublished><![CDATA[Tallinn]]></PlacePublished>
    <YearPublished>1974</YearPublished>
    <BookQuantityInStock>3</BookQuantityInStock>
    <BookAuthors>
      <Author>
        <AuthorId>3</AuthorId>
        <AuthorName><![CDATA[Mihhail Jemtsev]]></AuthorName>
        <OtherBooksByAuthor>
          <Book id="9" category="Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Päikeseaas]]></BookName>
            <BookPrice currency="EUR">3.55</BookPrice>
            <BookPages>85</BookPages>
            <BookYear>2005</BookYear>
            <BookQuantity>1</BookQuantity>
          </Book>
          <Book id="9" category="Ilukirjandus" language="Eesti">
            <BookName><![CDATA[Kuukera]]></BookName>
            <BookPrice currency="EUR">3.20</BookPrice>
            <BookPages>78</BookPages>
            <BookYear>2006</BookYear>
            <BookQuantity>0</BookQuantity>
          </Book>
        </OtherBooksByAuthor>
      </Author>
      <Author>
        <AuthorId>9</AuthorId>
        <AuthorName><![CDATA[Jermei Parnov]]></AuthorName>
      </Author>
    </BookAuthors>
  </Book>
</Books>

XML skeemifail

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Books">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Book">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="BookPublisher">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="PublisherName" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="BookName" type="xs:string" />
              <xs:element name="BookOverview" type="xs:string" />
              <xs:element name="Quality" type="xs:string" />
              <xs:element name="Pages" type="xs:nonNegativeInteger" />
              <xs:element name="BookFormatEnum">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Id" type="xs:nonNegativeInteger" />
                    <xs:element name="Value" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="CoverEnum">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Id" type="xs:nonNegativeInteger" />
                    <xs:element name="Value" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="BookFullPrice">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="currency" type="xs:string" use="required" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="BookDiscountedPrice">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="currency" type="xs:string" use="required" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="PlacePublished" type="xs:string" />
              <xs:element name="YearPublished" type="xs:nonNegativeInteger" />
              <xs:element name="BookQuantityInStock" type="xs:nonNegativeInteger" />
              <xs:element name="BookAuthors">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="Author">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="AuthorId" type="xs:nonNegativeInteger" />
                          <xs:element name="AuthorName" type="xs:string" />
                          <xs:element minOccurs="0" name="OtherBooksByAuthor">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element maxOccurs="unbounded" name="Book">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="BookName" type="xs:string" />
                                      <xs:element name="BookPrice">
                                        <xs:complexType>
                                          <xs:simpleContent>
                                            <xs:extension base="xs:decimal">
                                              <xs:attribute name="currency" type="xs:string" use="required" />
                                            </xs:extension>
                                          </xs:simpleContent>
                                        </xs:complexType>
                                      </xs:element>
                                      <xs:element name="BookPages" type="xs:nonNegativeInteger" />
                                      <xs:element name="BookYear" type="xs:nonNegativeInteger" />
                                      <xs:element name="BookQuantity" type="xs:nonNegativeInteger" />
                                    </xs:sequence>
                                    <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
                                    <xs:attribute name="category" type="xs:string" use="required" />
                                    <xs:attribute name="language" type="xs:string" use="required" />
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="BookDiscount">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="BookDiscountId" type="xs:nonNegativeInteger" />
                    <xs:element name="BookDiscountName" type="xs:string" />
                    <xs:element name="BookDiscountPrice">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:decimal">
                            <xs:attribute name="currency" type="xs:string" use="required" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="BookDiscountStart" type="xs:date" />
                    <xs:element name="BookDiscountEnd" type="xs:date" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="CategoryDiscounts">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="CategoryDiscount">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="CategoryDiscountId" type="xs:nonNegativeInteger" />
                          <xs:element name="CategoryDiscountName" type="xs:string" />
                          <xs:element name="CategoryDiscountPercent" type="xs:decimal" />
                          <xs:element name="CategoryDiscountStart" type="xs:date" />
                          <xs:element name="CategoryDiscountEnd" type="xs:date" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
            <xs:attribute name="category" type="xs:string" use="required" />
            <xs:attribute name="language" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSLT to HTML

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/Books">
    <html>
      <head>
        <title>Raamatud</title>
      </head>
      <body>
        <xsl:for-each select="Book" >
          <h1>
            "<xsl:value-of select="BookName"/>"
            <xsl:for-each select="BookAuthors/Author">
              <xsl:value-of select="AuthorName"/>
              <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
              </xsl:if>
            </xsl:for-each>
          </h1>
          <xsl:if test="BookDiscountedPrice">
            <strike>
              <xsl:value-of select="concat('Tavahind: ', BookFullPrice)"/>
            </strike>
            <xsl:value-of select="concat(' Soodushind: ', BookDiscountedPrice)"/>
          </xsl:if>
          <xsl:if test="not(BookDiscountedPrice)">
            <xsl:value-of select="concat('Hind: ', BookFullPrice)"/>
          </xsl:if>
          <br/>
          <xsl:value-of select="concat('Kirjastus: ', BookPublisher, ' ', YearPublished)"/>
          <br/>
          <xsl:value-of select="concat(Pages, ' lk')"/>
          <br/>
          <xsl:value-of select="concat('Kogus: ', BookQuantityInStock, ' tk')"/>
          <br/>
          <xsl:value-of select="concat('Seisukord: ', Quality)"/>
          <p>
            <xsl:value-of select="BookOverview"/>
          </p>
          <xsl:if test="count(BookAuthors/Author) > 1">
            <h3>Autorite teised raamatud: </h3>
          </xsl:if>
          <xsl:if test="count(BookAuthors/Author) = 1">
            <h3>Autori teised raamatud: </h3>
          </xsl:if>
          <ul>
            <xsl:for-each select="BookAuthors/Author">

              <xsl:if test="count(OtherBooksByAuthor/Book) > 0">
                <li>
                  <h3>
                    <xsl:value-of select="AuthorName"/>
                  </h3>
                  <ul>
                    <xsl:for-each select="OtherBooksByAuthor/Book">
                      <xsl:if test="BookQuantity > 0">
                        <p>
                          <li>
                            <b>
                              "<xsl:value-of select="BookName"/>"
                            </b>
                            <xsl:value-of select="concat(' ', BookYear)"/>
                            <br/>
                            <xsl:value-of select="concat('Kategooriad: ', @category)"/>
                            <br/>
                            <xsl:value-of select="concat(BookPages, ' lk ')"/>
                            <br/>
                            <xsl:value-of select="concat('Kogus: ', BookQuantity, ' tk')"/>
                            <br/>
                            <xsl:value-of select="concat(BookPrice, ' ', BookPrice/@currency)"/>
                          </li>
                        </p>
                      </xsl:if>
                    </xsl:for-each>
                  </ul>
                </li>
              </xsl:if>
            </xsl:for-each>
          </ul>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>


XSLT to XML

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:element name="Books">
      <xsl:for-each select="/Books/Book">
        <xsl:variable name="book" select="."/>
        <xsl:element name="Book">
          <xsl:attribute name="id">
            <xsl:value-of select="@id"/>
          </xsl:attribute>
          <xsl:element name="BookName">
            <xsl:value-of select="BookName" />
          </xsl:element>
          <xsl:element name="Category">
            <xsl:value-of select="@category"/>
          </xsl:element>
          <xsl:element name="Language">
            <xsl:value-of select="@language"/>
          </xsl:element>
          <xsl:copy-of select="BookFullPrice"/>
          <xsl:copy-of select="BookDiscountedPrice"/>
          <xsl:copy-of select="BookPublisher"/>
          <xsl:element name="BookOverview">
            <xsl:value-of select="BookOverview"/>
          </xsl:element>
          <xsl:element name="Quality">
            <xsl:value-of select="Quality"/>
          </xsl:element>
          <xsl:element name="Pages">
            <xsl:value-of select="Pages"/>
          </xsl:element>
          <xsl:element name="BookFormat">
            <xsl:value-of select="BookFormatEnum/Value"/>
          </xsl:element>
          <xsl:element name="Cover">
            <xsl:value-of select="CoverEnum/Value"/>
          </xsl:element>
          <xsl:element name="Published">
            <xsl:value-of select="PlacePublished"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="YearPublished"/>
          </xsl:element>
          <xsl:if test="BookQuantityInStock &lt; 3">
            <xsl:element name="BookQuantityInStock">
              <xsl:value-of select="BookQuantityInStock"/>
            </xsl:element>
          </xsl:if>
          <xsl:element name="BookAuthors">
            <xsl:for-each select="$book/BookAuthors/Author">
              <xsl:variable name="author" select="."/>
              <xsl:element name="Author">
                <xsl:attribute name="id">
                  <xsl:value-of select="AuthorId"/>
                </xsl:attribute>
                <xsl:element name="AuthorName">
                  <xsl:value-of select="AuthorName"/>
                </xsl:element>
                <xsl:element name="OtherBooksByAuthor">
                  <xsl:for-each select="$author/OtherBooksByAuthor/Book">
                    <xsl:element name="Book">
                      <xsl:attribute name="id">
                        <xsl:value-of select="@id"/>
                      </xsl:attribute>
                      <xsl:element name="BookName">
                        <xsl:value-of select="BookName" />
                      </xsl:element>
                      <xsl:element name="Category">
                        <xsl:value-of select="@category"/>
                      </xsl:element>
                      <xsl:element name="Language">
                        <xsl:value-of select="@language"/>
                      </xsl:element>
                      <xsl:copy-of select="BookPrice"/>
                    </xsl:element>
                  </xsl:for-each>
                </xsl:element>
              </xsl:element>
            </xsl:for-each>
          </xsl:element>
        </xsl:element>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Retsensioonid

Meie veebiteenuse, klientrakenduse ja XML retsensioon meeskonnale Miisiiks: retsensioon

Ajalogi

  • 28.03.2018 - esimene kohtumine ja idee paika panemine, Wiki lehe tegemine, projekti analüüsi koostamine
  • 06.05.2018 - pühapäevasel hackatonil projekti arendamine
  • 01.06.2018 - XML failide üles panemine Wiki lehele
  • 03.06.2018 - retsensioonide üles panemine Wiki lehele