Blogify: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Ttammeju (talk | contribs)
Hlaasmag (talk | contribs)
 
(13 intermediate revisions by 2 users not shown)
Line 4: Line 4:
* Cathy Toomast
* Cathy Toomast
* Tõnn Vaher
* Tõnn Vaher
= Veebiteenus =
'''Analüüs'''
'''Kirejeldus:'''<br>
Veebiteenuseks on blogi - “Blogify”. Võimalik on teha end kasutajaks ja sisselogida. Kasutajad saavad luua blogi postitusi. Postitusi on võimalik ka muuta ja kustutada. Selleks on eraldi blogihalduse vaade, et seda oleks hõlpsam teha. Kasutaja saab vaadata oma blogilehel enda blogipostitusi, mis ei ole draft staatuses ning seal vastata teiste kasutajate poolt tehtud kommentaaridele. Kui blogi on avalik, saavad teised kasutajad külastada kasutaja blogi, lugeda avalikke postitusi ja kommenteerida postitusi. <br>
Lisaks tavakasutaja rollile on olemas ka admini roll. Admin  saab blokeerida kasutajaid. Admin ei saa lugeda privaatseid blogisid või positusi! Ta saab kustutada ka avalikke postitusi, kui leiab, et need ei vasta nõuetele. Kui jääb aega, lisatakse adminile funktsionaalsused, mille kaudu ta näeb veebilehe ja blogide kohta erinevat statistikat.<br>
Kasutaja saab otsida postitust pealkirja järgi. Kui implementeeritakse tag-i süsteem, on võimalik ja selle järgi postitusi leida.<br>
Andmebaasi puhul kasutame code first lähenemist, kuid tegime ka ERD skeemi, et mõtteid koondada ning, et oleks võib-olla lihtsam klasse disainida. Andmevahetus veebiteenuse ja klientide vahel toimub REST’ina, kus edastatavate andmete formaadiks on JSON. Selle eeliseks on ka vajaduse tekkimisel kliendi poolel kasutatavus otse Javascriptis (JSON.parse()). Võrreldes XML-iga on JSON ka “lühem” (XML tag’id) ja tagab tänu sellele meile kiirema andmete edastamise. Lisaks, kasutame andmete transpordiks süsteemisiseselt DTO-sid, et hoida kokku aega erinevate päringute arvelt ja andmete mahult (DTO-sse kaasatud vaid valitud väljad).
'''Must have:'''
*Kasutaja registreerimine, sisselogimine, haldus
*CRUD funktsionaalsus blogipostitusele (pealkiri ja sisu)
*On näha blogipostituse loomise kuupäev
*Kasutajate liikide haldus (logimata kasutaja, loginud tavakasutaja ja admin alad)
*Postituste lehitsemine
*Postituste otsingusüsteem
'''Nice to have:'''
*Näha blogipostituse muutmise kuupäev
*Postitusele saab lisada silte(tag), mille järgi saab kuvada kõik seda kasutavad postitused
*Võimalus salvestada postitus mustandina
*Kasutaja saab valida, kas tema blogi on avalik või privaatne
*Üksikud postitused saab teha eraldi privaatseks
*Postitusele saab lisada kommentaare
*Anonüümne kommenteerimine
*Kommentaaride aja kuvamine sõltub hetke kuupäevast
*(Autor, admin) Kommentaaride haldus postituses
*Autori kommentaarid teistest eraldatud
*(Admin) Statistika postituste, kommentaaride kohta ajalise filtreerimisega
*(Admin) Statistika külastatavuse kohta
*(Admin) Blogipostituse muudatuste ajalugu
*Postitusele piltide lisamine
*Postituse teksti kujundamine
*RSS feed
*Teavituse süsteem emailile
*Teavituse süsteem lehel olles
*Sotsiaalmeedia integratsioon
*Filtreerimise ja sorteerimise võimalus otsingusüsteemile
*Mitmekeelsus (võimalus sisse ehitatud)
*Postitusele siltide lisamise võimalus
*Postituste kuvamine kuu ja aasta kaupa
*Postituste soovituste kuvamine (näiteks soovitada sama sildiga postitust)
*Postituse autori tutvustus peale postitust
*Kasutajate jälgimine (follow)
= XML / XSD / XSLT =


== XML fail ==
== XML fail ==
<source lang="xml">
<source lang="xml">
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
Line 57: Line 106:
</Main>
</Main>


</source>
<br><br><br>
== XSD fail ==
<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="Main">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Posts">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="Post">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Content" type="xs:string" />
                    <xs:element name="Comments">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element maxOccurs="unbounded" name="Comment">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="Content" type="xs:string" />
                              </xs:sequence>
                              <xs:attribute name="UserId" type="xs:unsignedInt" use="required" />
                              <xs:attribute name="Date" type="xs:dateTime" use="required" />
                              <xs:attribute name="Title" type="xs:string" use="required" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="PostId" type="xs:unsignedInt" use="required" />
                  <xs:attribute name="UserId" type="xs:unsignedInt" use="required" />
                  <xs:attribute name="Date" type="xs:dateTime" use="required" />
                  <xs:attribute name="Title" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Users">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="User">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Description" type="xs:string" />
                  </xs:sequence>
                  <xs:attribute name="UserId" type="xs:unsignedInt" use="required" />
                  <xs:attribute name="Username" type="xs:string" use="required" />
                  <xs:attribute name="Firstname" type="xs:string" use="required" />
                  <xs:attribute name="Surname" type="xs:string" use="required" />
                  <xs:attribute name="Email" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
</source>
</source>
<br><br><br>
<br><br><br>


= XSLT - Posts =
== XSLT - Posts ==
<source lang="xml">
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
Line 185: Line 298:
<br><br><br>
<br><br><br>


=XSLT Posts - Algne tulem=
==XSLT Posts - Algne tulem==
[[File:alg.png]]
[[File:alg.png]]
<br><br><br><br><br>
<br><br><br><br><br>


=XSLT Posts - Tingimustega tulem=
==XSLT Posts - Tingimustega tulem==
[[File:Trans1.PNG]]
[[File:Trans1.PNG]]
<br><br><br><br>
<br><br><br><br>
Line 195: Line 308:




= XSLT - Users =
== XSLT - Users XML ==
<source lang="xml">
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
Line 232: Line 345:
<br><br><br><br>
<br><br><br><br>


= XSLT Users XML tulem =
== XSLT Users XML tulem ==
<source lang="xml">
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
Line 245: Line 358:
</Users>
</Users>
</source>
</source>
<br><br><br>
== XSLT Users  ==
<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"/>
    <xsl:template match="/">
      <html>
        <body>
          <h1>Blog Users!</h1>
          <xsl:for-each select="/Main/Users/User">
            <h2>
              Username: <xsl:value-of select="@Username"/>
            </h2>
            <ul>
              <li>
                Firstname: <xsl:value-of select="@Firstname"/>
              </li>
              <li>
                Surname: <xsl:value-of select="@Surname"/>
              </li>
              <li>
                Email: <xsl:value-of select="@Email"/>
              </li>
              <li>
                Description: <xsl:value-of select="Description"/>
              </li>
            </ul>
          </xsl:for-each>
          <hr></hr>
          <h2>
            Showing all users where email does not contain @cia.gov
          </h2>
          <xsl:for-each select="/Main/Users/User">
            <xsl:if test="not(contains(@Email,'@cia.gov'))">
              <h2>
                Username: <xsl:value-of select="@Username"/>
              </h2>
              <ul>
                <li>
                  Firstname: <xsl:value-of select="@Firstname"/>
                </li>
                <li>
                  Surname: <xsl:value-of select="@Surname"/>
                </li>
                <li>
                  Email: <xsl:value-of select="@Email"/>
                </li>
                <li>
                  Description: <xsl:value-of select="Description"/>
                </li>
              </ul>
            </xsl:if>
          </xsl:for-each>
        </body>
      </html>
    </xsl:template>
</xsl:stylesheet>
</source>
<br><br><br>
== XSLT Users - Algne tulem==
[[File:Users.png]]
<br><br><br>
== XSLT Users - Tingimustega tulem==
[[File:Usersting.png]]


= Timeline =
= Timeline =
Line 252: Line 438:
<li>19.03.2016 Tegime transformatsioonifaile ja stiilifaili</li>
<li>19.03.2016 Tegime transformatsioonifaile ja stiilifaili</li>
<li>20.03.2016 Lisasime ühe transformatsioonifaili ja tegime muudatusi.</li>
<li>20.03.2016 Lisasime ühe transformatsioonifaili ja tegime muudatusi.</li>
<li>09.06.2016 Kaitsesime Blogify Projekti teenuse ja kliendi.</li>
</ul>
</ul>

Latest revision as of 23:46, 9 June 2017

Meeskond

  • Hando Laasmägi
  • Tarvo Tammejuur
  • Cathy Toomast
  • Tõnn Vaher

Veebiteenus

Analüüs

Kirejeldus:
Veebiteenuseks on blogi - “Blogify”. Võimalik on teha end kasutajaks ja sisselogida. Kasutajad saavad luua blogi postitusi. Postitusi on võimalik ka muuta ja kustutada. Selleks on eraldi blogihalduse vaade, et seda oleks hõlpsam teha. Kasutaja saab vaadata oma blogilehel enda blogipostitusi, mis ei ole draft staatuses ning seal vastata teiste kasutajate poolt tehtud kommentaaridele. Kui blogi on avalik, saavad teised kasutajad külastada kasutaja blogi, lugeda avalikke postitusi ja kommenteerida postitusi.
Lisaks tavakasutaja rollile on olemas ka admini roll. Admin saab blokeerida kasutajaid. Admin ei saa lugeda privaatseid blogisid või positusi! Ta saab kustutada ka avalikke postitusi, kui leiab, et need ei vasta nõuetele. Kui jääb aega, lisatakse adminile funktsionaalsused, mille kaudu ta näeb veebilehe ja blogide kohta erinevat statistikat.
Kasutaja saab otsida postitust pealkirja järgi. Kui implementeeritakse tag-i süsteem, on võimalik ja selle järgi postitusi leida.
Andmebaasi puhul kasutame code first lähenemist, kuid tegime ka ERD skeemi, et mõtteid koondada ning, et oleks võib-olla lihtsam klasse disainida. Andmevahetus veebiteenuse ja klientide vahel toimub REST’ina, kus edastatavate andmete formaadiks on JSON. Selle eeliseks on ka vajaduse tekkimisel kliendi poolel kasutatavus otse Javascriptis (JSON.parse()). Võrreldes XML-iga on JSON ka “lühem” (XML tag’id) ja tagab tänu sellele meile kiirema andmete edastamise. Lisaks, kasutame andmete transpordiks süsteemisiseselt DTO-sid, et hoida kokku aega erinevate päringute arvelt ja andmete mahult (DTO-sse kaasatud vaid valitud väljad).

Must have:

  • Kasutaja registreerimine, sisselogimine, haldus
  • CRUD funktsionaalsus blogipostitusele (pealkiri ja sisu)
  • On näha blogipostituse loomise kuupäev
  • Kasutajate liikide haldus (logimata kasutaja, loginud tavakasutaja ja admin alad)
  • Postituste lehitsemine
  • Postituste otsingusüsteem

Nice to have:

  • Näha blogipostituse muutmise kuupäev
  • Postitusele saab lisada silte(tag), mille järgi saab kuvada kõik seda kasutavad postitused
  • Võimalus salvestada postitus mustandina
  • Kasutaja saab valida, kas tema blogi on avalik või privaatne
  • Üksikud postitused saab teha eraldi privaatseks
  • Postitusele saab lisada kommentaare
  • Anonüümne kommenteerimine
  • Kommentaaride aja kuvamine sõltub hetke kuupäevast
  • (Autor, admin) Kommentaaride haldus postituses
  • Autori kommentaarid teistest eraldatud
  • (Admin) Statistika postituste, kommentaaride kohta ajalise filtreerimisega
  • (Admin) Statistika külastatavuse kohta
  • (Admin) Blogipostituse muudatuste ajalugu
  • Postitusele piltide lisamine
  • Postituse teksti kujundamine
  • RSS feed
  • Teavituse süsteem emailile
  • Teavituse süsteem lehel olles
  • Sotsiaalmeedia integratsioon
  • Filtreerimise ja sorteerimise võimalus otsingusüsteemile
  • Mitmekeelsus (võimalus sisse ehitatud)
  • Postitusele siltide lisamise võimalus
  • Postituste kuvamine kuu ja aasta kaupa
  • Postituste soovituste kuvamine (näiteks soovitada sama sildiga postitust)
  • Postituse autori tutvustus peale postitust
  • Kasutajate jälgimine (follow)

XML / XSD / XSLT

XML fail

<?xml version="1.0" encoding="utf-8" ?>
<Main>
  <Posts>
    <Post PostId="1" UserId="1" Date="2015-01-13T07:25:15" Title="My trip to Norway">
      <Content><![CDATA[Blog post content.]]></Content>
      <Comments>
        <Comment UserId="2" Date="2015-01-14T13:55:33" Title="I am so envious!!!">
          <Content><![CDATA[I wish i had the time to do those cool things]]></Content>
        </Comment>
        <Comment UserId="3" Date="2015-02-11T19:24:22" Title="Prr... So cold out there">
          <Content><![CDATA[I don't know how you managed to stay alive there...]]></Content>
        </Comment>
      </Comments>
    </Post>
    <Post PostId="2" UserId="1" Date="2016-03-14T10:24:12" Title="My summer in Romania">
      <Content><![CDATA[Blog post content..]]></Content>
      <Comments>
        <Comment UserId="3" Date="2017-03-14T11:21:34" Title="Home of Dracula?!">
          <Content><![CDATA[So did you meat the charming beast out in the mountains?]]></Content>
        </Comment>
        <Comment UserId="2" Date="2017-03-15T12:56:11" Title="Do they use Euros there?">
          <Content><![CDATA[Do they have their own money or are they using Euros?]]></Content>
        </Comment>
        <Comment UserId="3" Date="2017-03-16T19:22:54" Title="Why u so poor?">
          <Content><![CDATA[Romania is for people who can't afford Greece?!]]></Content>
        </Comment>
      </Comments>
    </Post>
    <Post PostId="3" UserId="2" Date="2017-03-16T11:33:55" Title="Our love in Berlin">
      <Content><![CDATA[Blog post content.]]></Content>
      <Comments>
        <Comment UserId="1" Date="2017-03-19T16:23:12" Title="Such love, such lies...">
          <Content><![CDATA[I know all your secrets and all about Mark]]></Content>
        </Comment>
      </Comments>
    </Post>
  </Posts>
  <Users>
    <User UserId="1" Username="Hunter241" Firstname="Thomas" Surname="Stansfield" Email="tommy.stansfield@gmail.com">
      <Description><![CDATA[I am a tough old man standing out for my country]]></Description>
    </User>
    <User UserId="2" Username="ToughChick53" Firstname="Irene" Surname="Kennedy" Email="irene@cia.gov">
      <Description><![CDATA[Recently I have been feeling a little down because of the death of my mentor and all those attacks against me.]]></Description>
    </User>
    <User UserId="3" Username="IronMan" Firstname="Mitch" Surname="Rapp" Email="eyeinthemiddleeast@hotmail.com">
      <Description><![CDATA[I have been, where few American men have been.]]></Description>
    </User>
  </Users>
</Main>




XSD fail

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Main">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Posts">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="Post">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Content" type="xs:string" />
                    <xs:element name="Comments">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element maxOccurs="unbounded" name="Comment">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="Content" type="xs:string" />
                              </xs:sequence>
                              <xs:attribute name="UserId" type="xs:unsignedInt" use="required" />
                              <xs:attribute name="Date" type="xs:dateTime" use="required" />
                              <xs:attribute name="Title" type="xs:string" use="required" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="PostId" type="xs:unsignedInt" use="required" />
                  <xs:attribute name="UserId" type="xs:unsignedInt" use="required" />
                  <xs:attribute name="Date" type="xs:dateTime" use="required" />
                  <xs:attribute name="Title" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Users">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="User">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Description" type="xs:string" />
                  </xs:sequence>
                  <xs:attribute name="UserId" type="xs:unsignedInt" use="required" />
                  <xs:attribute name="Username" type="xs:string" use="required" />
                  <xs:attribute name="Firstname" type="xs:string" use="required" />
                  <xs:attribute name="Surname" type="xs:string" use="required" />
                  <xs:attribute name="Email" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>




XSLT - Posts

<?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 name="formatDate">
    <xsl:param name="dateTime" />
    <xsl:variable name="date" select="substring-before($dateTime, 'T')" />
    <xsl:variable name="year" select="substring-before($date, '-')" />
    <xsl:variable name="month" select="substring-before(substring-after($date, '-'), '-')" />
    <xsl:variable name="day" select="substring-after(substring-after($date, '-'), '-')" />
    <xsl:value-of select="concat($day, '.', $month, '.', $year)" />
  </xsl:template>

  <xsl:template match="/">
    <html>
      <body>
        <h1>Blog posts!</h1>
        <xsl:for-each select="/Main/Posts/Post">
          <h2>
            <xsl:value-of select="@Title"/> (
            <xsl:call-template name="formatDate">
              <xsl:with-param name="dateTime" select="@Date" />
            </xsl:call-template>
            )
          </h2>
          <p>
            <xsl:value-of select="Content"/>
          </p>

          <h3>Comments</h3>
          <ol>
            <xsl:for-each select="Comments/Comment">
              <li>
                <b>
                  <xsl:value-of select="@Title"/>
                </b>
                (
                <xsl:call-template name="formatDate">
                  <xsl:with-param name="dateTime" select="@Date" />
                </xsl:call-template>
                )
                <p>
                  <xsl:value-of select="Content"/>
                </p>
              </li>
              <!--Ends comments list-->
            </xsl:for-each>
          </ol>
          <!--Ends posts list-->
        </xsl:for-each>
        <hr></hr>
        <h2>
          <u>Comments from user IronMan</u>
        </h2>
        <ol>
          <xsl:for-each select="/Main/Posts/Post/Comments/Comment">
            <xsl:if test="@UserId = 3">
              <li>
                <xsl:value-of select="@Title"/>
                (
                <xsl:call-template name="formatDate">
                  <xsl:with-param name="dateTime" select="@Date" />
                </xsl:call-template>
                )
                <br></br>
                <xsl:value-of select="Content"/>
              </li>
            </xsl:if>
          </xsl:for-each>
        </ol>

        <hr></hr>
        <h2>
          <u>Showing all posts with comments,<br></br>
        where day of week of published comment is less than 15, and sorted in descending order</u>
        </h2>
        <xsl:for-each select="/Main/Posts/Post">
          <xsl:for-each select="Comments/Comment">
            <xsl:sort select="@Date" order="descending"/>

            <xsl:variable name="date" select="substring-before(@Date, 'T')" />
            <xsl:variable name="day" select="substring-after(substring-after($date, '-'), '-')" />

            <xsl:if test="$day &lt; 15">
              <h2>
                <xsl:value-of select="@Title"/>
                (
                <xsl:call-template name="formatDate">
                  <xsl:with-param name="dateTime" select="@Date" />
                </xsl:call-template>
                )
              </h2>
              <p>
                <xsl:value-of select="Content"/>
              </p>

              <h3>Comments</h3>
              <ol>
                <li>
                  <b>
                    <xsl:value-of select="@Title"/>
                  </b>
                  (
                  <xsl:call-template name="formatDate">
                    <xsl:with-param name="dateTime" select="@Date" />
                  </xsl:call-template>
                  )
                  <p>
                    <xsl:value-of select="Content"/>
                  </p>
                </li>
              </ol>
            </xsl:if>
          </xsl:for-each>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>




XSLT Posts - Algne tulem






XSLT Posts - Tingimustega tulem






XSLT - Users 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="/">
    <Users>
        <xsl:for-each select="/Main/Users/User">
          <xsl:if test="@Firstname='Mitch'">
            <User>
              <Username>
                <xsl:value-of select="@Username"/>
              </Username>
              <Firstname>
                <xsl:value-of select="@Firstname"/>
              </Firstname>
              <Surname>
                <xsl:value-of select="@Surname"/>
              </Surname>
              <Email>
                <xsl:value-of select="@Email"/>
              </Email>
              <Description>
                <xsl:value-of select="Description"/>
              </Description>
            </User>
          </xsl:if>  
        </xsl:for-each>
    </Users>
  </xsl:template>
</xsl:stylesheet>





XSLT Users XML tulem

<?xml version="1.0" encoding="utf-8"?>
<Users>
  <User>
    <Username>IronMan</Username>
    <Firstname>Mitch</Firstname>
    <Surname>Rapp</Surname>
    <Email>eyeinthemiddleeast@hotmail.com</Email>
    <Description>I have been, where few American men have been.</Description>
  </User>
</Users>




XSLT Users

<?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="/">
      <html>
        <body>
          <h1>Blog Users!</h1>
          <xsl:for-each select="/Main/Users/User">
            <h2>
              Username: <xsl:value-of select="@Username"/>
            </h2>
            <ul>
              <li>
                Firstname: <xsl:value-of select="@Firstname"/>
              </li>
              <li>
                Surname: <xsl:value-of select="@Surname"/>
              </li>
              <li>
                Email: <xsl:value-of select="@Email"/>
              </li>
              <li>
                Description: <xsl:value-of select="Description"/>
              </li>
            </ul>
          </xsl:for-each>
          <hr></hr>
          <h2>
            Showing all users where email does not contain @cia.gov
          </h2>
          <xsl:for-each select="/Main/Users/User">
            <xsl:if test="not(contains(@Email,'@cia.gov'))">
              <h2>
                Username: <xsl:value-of select="@Username"/>
              </h2>
              <ul>
                <li>
                  Firstname: <xsl:value-of select="@Firstname"/>
                </li>
                <li>
                  Surname: <xsl:value-of select="@Surname"/>
                </li>
                <li>
                  Email: <xsl:value-of select="@Email"/>
                </li>
                <li>
                  Description: <xsl:value-of select="Description"/>
                </li>
              </ul>
            </xsl:if>
          </xsl:for-each>
        </body>
      </html>
    </xsl:template>
</xsl:stylesheet>




XSLT Users - Algne tulem




XSLT Users - Tingimustega tulem

Timeline

  • 10.03.2016 Arutasime projekti üldteemat ning sündis otsus vähemalt esialgu XML osas teha töö blogikeskkonna teemal
  • 18.03.2016 Alustasime XML kirjutamist
  • 19.03.2016 Tegime transformatsioonifaile ja stiilifaili
  • 20.03.2016 Lisasime ühe transformatsioonifaili ja tegime muudatusi.
  • 09.06.2016 Kaitsesime Blogify Projekti teenuse ja kliendi.