JRT
Meeskond
Riho Uusjärv
Jevgeni Gavrilov
Tiit Kuuskmäe
Blog
19.03.2017 - Meeskonna loomine, teema välja mõtlemine, XML, XSD ja XSLT koostamine
20.03.2017 - Teine XSLT koostamine ja valmis
26.03.207 - Retsenseerimine
Tööd
XML
Teema
Spordisaalis on erinevad trennid, milles käivad erinevad isikud. XSLT jaoks siis teeme erinevad valitud filtreeringud
Lae failid alla
XML
<?xml version="1.0" encoding="utf-8" ?> <users> <subscriptions> <subscription name="Balance"> <prices> <price type="silver" currency="EUR">44.99</price> <price type="gold" currency="EUR">39.99</price> <price type="standard" currency="EUR">50.99</price> </prices> </subscription> <subscription name="Gym"> <prices> <price type="gold" currency="EUR">69.99</price> <price type="silver" currency="EUR">79.99</price> <price type="standard" currency="EUR">89.99</price> </prices> </subscription> <subscription name="BodyPump"> <prices> <price type="gold" currency="EUR">44.99</price> <price type="silver" currency="EUR">49.99</price> <price type="standard" currency="EUR">55.99</price> </prices> </subscription> <subscription name="Yoga"> <prices> <price type="gold" currency="EUR">39.99</price> <price type="silver" currency="EUR">42.99</price> <price type="standard" currency="EUR">45.99</price> </prices> </subscription> <subscription name="HotYoga"> <prices> <price type="gold" currency="EUR">49.99</price> <price type="silver" currency="EUR">52.99</price> <price type="standard" currency="EUR">55.99</price> </prices> </subscription> </subscriptions> <user id="1" status="gold"> <firstName><![CDATA[Peeter]]></firstName> <lastName><![CDATA[Banaan]]></lastName> <born><![CDATA[11.12.2000]]></born> <sex><![CDATA[M]]></sex> <subscriptions> <subscription expires="2017-05-11"><![CDATA[Balance]]></subscription> <subscription expires="2017-08-26"><![CDATA[Gym]]></subscription> <subscription expires="2017-09-01"><![CDATA[Yoga]]></subscription> </subscriptions> <contacts> <contact type="phone"><![CDATA[55665566]]></contact> <contact type="email"><![CDATA[peeter@gmail.ee]]></contact> <contact type="skype"><![CDATA[PeeterB]]></contact> </contacts> </user> <user id="2" status="silver"> <firstName><![CDATA[Merlin]]></firstName> <lastName><![CDATA[Kuusk]]></lastName> <born><![CDATA[11.07.1997]]></born> <sex><![CDATA[W]]></sex> <subscriptions> <subscription expires="2017-05-13"><![CDATA[BodyPump]]></subscription> <subscription expires="2017-09-11"><![CDATA[Balance]]></subscription> </subscriptions> <contacts> <contact type="phone"><![CDATA[5123123]]></contact> </contacts> </user> <user id="3" status="gold"> <firstName><![CDATA[Maarika]]></firstName> <lastName><![CDATA[Tamm]]></lastName> <born><![CDATA[05.07.1999]]></born> <sex><![CDATA[W]]></sex> <subscriptions> <subscription expires="2017-08-11"><![CDATA[Yoga]]></subscription> <subscription expires="2017-11-23"><![CDATA[HotYoga]]></subscription> </subscriptions> <contacts> <contact type="email"><![CDATA[maarika@gmail.com]]></contact> </contacts> </user> <user id="4" status="gold"> <firstName><![CDATA[Peeter]]></firstName> <lastName><![CDATA[Tamm]]></lastName> <born><![CDATA[22.03.2000]]></born> <sex><![CDATA[M]]></sex> <subscriptions> <subscription expires="2017-05-13"><![CDATA[BodyPump]]></subscription> <subscription expires="2017-05-13"><![CDATA[Gym]]></subscription> </subscriptions> <contacts> <contact type="phone"><![CDATA[55588899]]></contact> <contact type="email"><![CDATA[PeeterT@gmail.com]]></contact> </contacts> </user> <user id="5" status="silver"> <firstName><![CDATA[Mihkel]]></firstName> <lastName><![CDATA[Koopov]]></lastName> <born><![CDATA[15.06.1994]]></born> <sex><![CDATA[M]]></sex> <contacts> <contact type="phone"><![CDATA[55588877]]></contact> <contact type="skype"><![CDATA[MKoopov]]></contact> </contacts> </user> <user id="6" status="standard"> <firstName><![CDATA[Georg]]></firstName> <lastName><![CDATA[Karu]]></lastName> <born><![CDATA[03.03.1994]]></born> <sex><![CDATA[M]]></sex> <subscriptions> <subscription expires="2017-12-17"><![CDATA[Balance]]></subscription> <subscription expires="2017-09-01"><![CDATA[Gym]]></subscription> </subscriptions> </user> <user id="7" status="standard"> <firstName><![CDATA[Liisa]]></firstName> <lastName><![CDATA[Leppmaa]]></lastName> <born><![CDATA[15.06.1991]]></born> <sex><![CDATA[W]]></sex> <subscriptions> <subscription expires="2017-09-11"><![CDATA[BodyPump]]></subscription> <subscription expires="2017-07-10"><![CDATA[HotYoga]]></subscription> </subscriptions> <contacts> <contact type="phone"><![CDATA[55512377]]></contact> <contact type="skype"><![CDATA[LLee]]></contact> </contacts> </user> </users>
XML schema (XSD)
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="users"> <xs:complexType> <xs:sequence> <xs:element name="subscriptions"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="subscription"> <xs:complexType> <xs:sequence> <xs:element name="prices"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="price"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:decimal"> <xs:attribute name="type" type="xs:string" use="required" /> <xs:attribute name="currency" type="xs:string" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="name" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element maxOccurs="unbounded" name="user"> <xs:complexType> <xs:sequence> <xs:choice maxOccurs="unbounded"> <xs:element name="firstName" type="xs:string" /> <xs:element name="lastName" type="xs:string" /> <xs:element name="subscriptions"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="subscription"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="expires" type="xs:date" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="contacts"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="contact"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="type" type="xs:string" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="born" type="xs:string" /> <xs:element name="sex" type="xs:string" /> </xs:choice> </xs:sequence> <xs:attribute name="id" type="xs:int" use="required" /> <xs:attribute name="status" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
XSLT 1
Kuvab inimeste nime, liikme staatuse, treeningud koos hindedega
<?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> <head> <title> Workout: </title> </head> <body> <h2>People list with workout and price:</h2> <xsl:for-each select="/users/user"> <xsl:text>Name: </xsl:text> <xsl:value-of select="firstName"/> <xsl:text> </xsl:text> <xsl:value-of select="lastName"/> <br></br> <xsl:text>Member status: </xsl:text> <xsl:variable name="Status" select="@status"/> <xsl:value-of select="@status"/> <br></br> <xsl:if test="subscriptions/subscription != ''"> <xsl:text>Workouts and prices: </xsl:text> <ul> <xsl:for-each select="subscriptions/subscription"> <li> <xsl:text> </xsl:text> <xsl:variable name="SelectedSubscription" select="translate(text(), ' ', '')"/> <xsl:for-each select="/users/subscriptions/subscription"> <xsl:variable name="Subscription" select="@name"/> <xsl:if test="$Subscription= $SelectedSubscription"> <xsl:for-each select="prices/price"> <xsl:if test="$Status = @type"> <xsl:value-of select="$Subscription"/> <xsl:text>: </xsl:text> <xsl:value-of select="."/> <xsl:value-of select="@currency"/> </xsl:if> </xsl:for-each> </xsl:if> </xsl:for-each> </li> </xsl:for-each> </ul> </xsl:if> <br></br> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
Näidis
XSLT 2
<?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="/"> <main> <xsl:for-each select="users/subscriptions/subscription"> <subscription> <xsl:attribute name="id"> <xsl:value-of select="position()"/> </xsl:attribute> <xsl:attribute name="name"> <xsl:value-of select="@name"/> </xsl:attribute> <xsl:variable name="currentSubscription" select="@name" /> <usersWithPrices> <xsl:for-each select="/users/user"> <xsl:variable name="currentUser" select="."></xsl:variable> <xsl:for-each select="subscriptions/subscription"> <xsl:variable name="sub" select="."/> <xsl:if test="$sub = $currentSubscription"> <userWithPrice> <user> <xsl:attribute name="id"> <xsl:value-of select="$currentUser/@id"/> </xsl:attribute> <xsl:value-of select="$currentUser/firstName"/> <xsl:text> </xsl:text> <xsl:value-of select="$currentUser/lastName"/> </user> <xsl:variable name="status" select="$currentUser/@status"/> <xsl:for-each select="/users/subscriptions/subscription"> <xsl:variable name="subscr" select="."></xsl:variable> <xsl:for-each select="$subscr/prices/price"> <xsl:if test="$subscr/@name = $currentSubscription"> <xsl:variable name="curObj" select="."/> <xsl:if test="$curObj/@type = $status"> <price> <xsl:attribute name="currency"> <xsl:value-of select="$curObj/@currency"/> </xsl:attribute> <xsl:attribute name="type"> <xsl:value-of select="$curObj/@type"/> </xsl:attribute> <xsl:value-of select="."/> </price> </xsl:if> </xsl:if> </xsl:for-each> </xsl:for-each> </userWithPrice> </xsl:if> <xsl:value-of select="@status"/> </xsl:for-each> </xsl:for-each> </usersWithPrices> </subscription> </xsl:for-each> </main> </xsl:template> </xsl:stylesheet>
Näidis
<?xml version="1.0" encoding="utf-8"?> <main> <subscription id="1" name="Balance"> <usersWithPrices> <userWithPrice> <user id="1">Peeter Banaan</user> <price currency="EUR" type="gold">39.99</price> </userWithPrice> <userWithPrice> <user id="2">Merlin Kuusk</user> <price currency="EUR" type="silver">44.99</price> </userWithPrice> <userWithPrice> <user id="6">Georg Karu</user> <price currency="EUR" type="standard">50.99</price> </userWithPrice> </usersWithPrices> </subscription> <subscription id="2" name="Gym"> <usersWithPrices> <userWithPrice> <user id="1">Peeter Banaan</user> <price currency="EUR" type="gold">69.99</price> </userWithPrice> <userWithPrice> <user id="4">Peeter Tamm</user> <price currency="EUR" type="gold">69.99</price> </userWithPrice> <userWithPrice> <user id="6">Georg Karu</user> <price currency="EUR" type="standard">89.99</price> </userWithPrice> </usersWithPrices> </subscription> <subscription id="3" name="BodyPump"> <usersWithPrices> <userWithPrice> <user id="2">Merlin Kuusk</user> <price currency="EUR" type="silver">49.99</price> </userWithPrice> <userWithPrice> <user id="4">Peeter Tamm</user> <price currency="EUR" type="gold">44.99</price> </userWithPrice> <userWithPrice> <user id="7">Liisa Leppmaa</user> <price currency="EUR" type="standard">55.99</price> </userWithPrice> </usersWithPrices> </subscription> <subscription id="4" name="Yoga"> <usersWithPrices> <userWithPrice> <user id="1">Peeter Banaan</user> <price currency="EUR" type="gold">39.99</price> </userWithPrice> <userWithPrice> <user id="3">Maarika Tamm</user> <price currency="EUR" type="gold">39.99</price> </userWithPrice> </usersWithPrices> </subscription> <subscription id="5" name="HotYoga"> <usersWithPrices> <userWithPrice> <user id="3">Maarika Tamm</user> <price currency="EUR" type="gold">49.99</price> </userWithPrice> <userWithPrice> <user id="7">Liisa Leppmaa</user> <price currency="EUR" type="standard">55.99</price> </userWithPrice> </usersWithPrices> </subscription> </main>
Retsensioonid
XML Retsensioonid
Retsensioon meeskonnale "PC KartKicker"
Meeskonna "PC KartKicker" XML failide sisu leiab [1]
- XML
XML fail valideerimisel ei olnud ühtegi viga. On olemas nõutud 4 loogilist dimensiooni ning atribuute on ka piisavalt ning need on sammuti piisavalt spetsiifilised ehk kõik õppejõu märgitud kriteeriumid on täidetud. XML jaotus on korrektne ja kergesti arusaadav. CDATA oleks võinud kastusel olla.
- Skeemifail (XSD)
XML ei vasta XSD kirjelduses nõutud väljade parameetrile ehk storages-> storage -> type on XSD-s puudu. Enda eelistused:
- maxGpuLength string -> integer
- maxCpuHeight string -> integer
- cooler string -> boolean
- ECC string -> boolean
- speed string -> decimal
- liquid string -> boolean
- usb3 string -> boolean
Mitmed errorid:
Cvc-complex-type.3.2.2: Attribute 'type' Is Not Allowed To Appear In Element 'storage'., Line '102', Column '140'. Cvc-datatype-valid.1.2.1: '' Is Not A Valid Value For 'integer'., Line '102', Column '140'. Cvc-attribute.3: The Value '' Of Attribute 'rpm' On Element 'storage' Is Not Valid With Respect To Its Type, 'integer'., Line '102', Column '140'. Cvc-complex-type.3.2.2: Attribute 'type' Is Not Allowed To Appear In Element 'storage'., Line '103', Column '142'. Cvc-datatype-valid.1.2.1: '' Is Not A Valid Value For 'integer'., Line '103', Column '142'. Cvc-attribute.3: The Value '' Of Attribute 'rpm' On Element 'storage' Is Not Valid With Respect To Its Type, 'integer'., Line '103', Column '142'. Cvc-complex-type.3.2.2: Attribute 'type' Is Not Allowed To Appear In Element 'storage'., Line '104', Column '143'. Cvc-datatype-valid.1.2.1: '' Is Not A Valid Value For 'integer'., Line '104', Column '143'. Cvc-attribute.3: The Value '' Of Attribute 'rpm' On Element 'storage' Is Not Valid With Respect To Its Type, 'integer'., Line '104', Column '143'. Cvc-complex-type.3.2.2: Attribute 'type' Is Not Allowed To Appear In Element 'storage'., Line '105', Column '153'. Cvc-complex-type.3.2.2: Attribute 'type' Is Not Allowed To Appear In Element 'storage'., Line '106', Column '154'. Cvc-complex-type.3.2.2: Attribute 'type' Is Not Allowed To Appear In Element 'storage'., Line '107', Column '148'.
- Transformatsioonid
Vead:
- Tegemist on mõlemal juhul vaid ühe for-each tsükliga
- Pole kasutatud tingimusi
- Pole tehtud eraldi HTML ja XML
Mõlemad XSLT-d ei vasta väljatoodud nõuetele
- Kokkuvõtte
Lohakas töö, tundub et üks liige on selle kiirelt ära teinud, et õigeks ajaks valmis saada ja teised ei vaevunud vaatamagi. Validaatoriga oleks võinud vähemalt üle lasta ja pisi vead likvideerida aga sedagi pole tehtud. Oleks soovitanud vähem vaeva näha kirju XML-iga ja seda aega kulutada korrektse XSD ja XSLT-d tegemiseks.