Team SPOT
From ICO wiki test
Kodutöö aines "Võrgurakendused II: hajussüsteemide ehitamine"
Liikmed
- Sigrid Pachel
- Oliver Tiks
Idee
XML / XSD / XSLT
XML
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="Trainings"> <xs:complexType> <xs:sequence> <xs:element name="Styles"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Style"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Id" type="xs:int" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:unique name="UniqueStyleId"> <xs:selector xpath="Style"/> <xs:field xpath="@Id"/> </xs:unique> </xs:element> <xs:element name="Instructors"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Instructor"> <xs:complexType> <xs:sequence> <xs:element name="Name" type="xs:string"/> </xs:sequence> <xs:attribute name="Id" type="xs:int" use="required" /> <xs:attribute name="Rating" type="xs:decimal" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:unique name="UniqueInstructorId"> <xs:selector xpath="Instructor"/> <xs:field xpath="@Id"/> </xs:unique> </xs:element> <xs:element name="Venues"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Venue"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Id" type="xs:int" use="required" /> <xs:attribute name="GroupSize" type="xs:int" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:unique name="UniqueVenueId"> <xs:selector xpath="Venue"/> <xs:field xpath="@Id"/> </xs:unique> </xs:element> <xs:element maxOccurs="unbounded" name="Training"> <xs:complexType> <xs:all> <xs:element name="Name" type="xs:string" /> <xs:element name="Description" type="xs:string" /> <xs:element name="Styles"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Style"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Id" type="xs:int" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Schedule"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="ScheduleItem"> <xs:complexType> <xs:all> <xs:element maxOccurs="1" name="Time"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:dateTime"> <xs:attribute name="Duration" type="xs:duration" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="Instructors"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Instructor"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Id" type="xs:int" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element minOccurs="0" maxOccurs="1" name="Comment" type="xs:string" /> </xs:all> <xs:attribute name="Id" type="xs:int" use="required" /> <xs:attribute name="VenueId" type="xs:int" use="required" /> <xs:attribute name="GroupSize" type="xs:int" use="optional" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="VideoUrl" type="xs:string" /> </xs:all> <xs:attribute name="Id" type="xs:int" use="required" /> <xs:attribute name="Licence" type="xs:string" use="optional" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:unique name="UniqueTrainingId"> <xs:selector xpath="Training"/> <xs:field xpath="@Id"/> </xs:unique> <xs:unique name="UniqueScheduleItemId"> <xs:selector xpath="Training/Schedule/ScheduleItem"/> <xs:field xpath="@Id"/> </xs:unique> </xs:element> </xs:schema>
XSLT (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" /> <xsl:template match="/"> <html> <head> <title>SuperSportsClub - Trainings</title> <style> body { background:BurlyWood; text-align: center; } .section { text-align:left; width:1000px; padding:20px; background:Chocolate; margin: auto; } table, th, td, .section { border: 1px solid black; } th { text-align:left; padding-left: 10px; padding-right: 10px; } td { text-align:center; } p { text-align:justify; } .description { vertical-align:top; padding:10px; } </style> </head> <body> <h1>Trainings at SuperSportsClub</h1> <xsl:for-each select="/Trainings/Styles/Style"> <xsl:sort select="."/> <xsl:variable select="." name="SelectedStyle" /> <div class="section" > <h2> <xsl:value-of select="$SelectedStyle" /> </h2> <ul> <xsl:for-each select="/Trainings/Training"> <xsl:sort select="."/> <xsl:variable name="Training" select="." /> <xsl:if test="Styles/Style/@Id = $SelectedStyle/@Id"> <li> <h3> <xsl:value-of select="$Training/Name" /> <xsl:if test="$Training/@Licence"> <xsl:text> (</xsl:text> <xsl:value-of select="$Training/@Licence" /> <xsl:text>)</xsl:text> </xsl:if> </h3> <table> <tr> <th>When:</th> <th>Duration:</th> <th>Where:</th> <th>Instructors:</th> </tr> <xsl:for-each select="$Training/Schedule/ScheduleItem"> <xsl:sort select="Time"/> <xsl:variable name="StartTime" select="Time"/> <xsl:variable name="Duration" select="$StartTime/@Duration"/> <tr> <td width="150" > <xsl:value-of select="concat( substring($StartTime, 9, 2), '.', substring($StartTime, 6, 2), '.', substring($StartTime, 1, 4), ' ', substring($StartTime, 12, 2), ':', substring($StartTime, 15, 2)) " /> <xsl:if test="Comment"> <br/> <div style="color:Green"> <xsl:value-of select="Comment"/> </div> </xsl:if> </td> <td width="100"> <xsl:value-of select="substring($Duration, 3, 6)" /> </td> <td width="150"> <xsl:variable name="VenueId" select="@VenueId"/> <xsl:value-of select="/Trainings/Venues/Venue[@Id=$VenueId]" /> </td> <td width="250"> <xsl:for-each select="Instructors/Instructor"> <xsl:variable name="InstructorId" select="@Id"></xsl:variable> <xsl:variable name="SelectedInstructor" select="/Trainings/Instructors/Instructor[@Id=$InstructorId]" /> <xsl:value-of select="$SelectedInstructor/Name"/> <xsl:text> (</xsl:text> <xsl:value-of select="$SelectedInstructor/@Rating" /> <xsl:text>)</xsl:text> <br/> </xsl:for-each> </td> </tr> </xsl:for-each> </table> <br/> <table> <tr> <td> <xsl:variable name="VideoUrl" select="$Training/VideoUrl" /> <iframe width="420" height="315" src="{$VideoUrl}"></iframe> </td> <td class="description" width="420"> <p> <b>Description:</b> </p> <p> <xsl:value-of select="$Training/Description" /> </p> </td> </tr> </table> </li> </xsl:if> </xsl:for-each> </ul> </div> <br/> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
XSLT (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" cdata-section-elements="Name Style Comment"/> <xsl:template match="/"> <Schedule> <xsl:for-each select="/Trainings/Training"> <xsl:sort select="Name"/> <xsl:variable name="SelectedTraining" select="." /> <xsl:for-each select="Schedule/ScheduleItem"> <xsl:sort select="Time"/> <ScheduleItem> <xsl:variable name="VenueId" select="@VenueId" /> <xsl:variable name="SelectedVenue" select="/Trainings/Venues/Venue[@Id=$VenueId]" /> <xsl:attribute name="Id"> <xsl:value-of select="@Id"/> </xsl:attribute> <xsl:attribute name="GroupSize"> <xsl:choose> <xsl:when test="@GroupSize"> <xsl:value-of select="@GroupSize"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$SelectedVenue/@GroupSize"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> <Venue> <xsl:attribute name="Id"> <xsl:value-of select="$VenueId"/> </xsl:attribute> <xsl:value-of select="$SelectedVenue"/> </Venue> <Training> <xsl:attribute name="Id"> <xsl:value-of select="$SelectedTraining/@Id"/> </xsl:attribute> <xsl:if test="$SelectedTraining/@Licence"> <xsl:attribute name="Licence"> <xsl:value-of select="$SelectedTraining/@Licence"/> </xsl:attribute> </xsl:if> <Name> <xsl:value-of select="$SelectedTraining/Name"/> </Name> <Styles> <xsl:for-each select="$SelectedTraining/Styles/Style"> <xsl:variable name="StyleId" select="@Id" /> <Style> <xsl:attribute name="StyleId"> <xsl:value-of select="$StyleId"/> </xsl:attribute> <xsl:value-of select="/Trainings/Styles/Style[@Id=$StyleId]"/> </Style> </xsl:for-each> </Styles> </Training> <Time> <xsl:attribute name="Duration"> <xsl:value-of select="Time/@Duration"/> </xsl:attribute> <xsl:value-of select ="Time"/> </Time> <Instructors> <xsl:for-each select="Instructors/Instructor"> <xsl:variable name="InstructorId" select="@Id"/> <xsl:variable name="SelectedInstructor" select="/Trainings/Instructors/Instructor[@Id=$InstructorId]"/> <Instructor> <xsl:attribute name="Id"> <xsl:value-of select="$InstructorId"/> </xsl:attribute> <xsl:attribute name="Rating"> <xsl:value-of select="$SelectedInstructor/@Rating"/> </xsl:attribute> <Name> <xsl:value-of select="$SelectedInstructor/Name"/> </Name> </Instructor> </xsl:for-each> </Instructors> <xsl:if test="Comment"> <Comment> <xsl:value-of select="Comment"/> </Comment> </xsl:if> </ScheduleItem> </xsl:for-each> </xsl:for-each> </Schedule> </xsl:template> </xsl:stylesheet>
XML (transformed)
<?xml version="1.0" encoding="utf-8"?> <Schedule> <ScheduleItem Id="3" GroupSize="30"> <Venue Id="2">Hall 2</Venue> <Training Id="2" Licence="LesMills"> <Name><![CDATA[BodyBalance™]]></Name> <Styles> <Style StyleId="2"><![CDATA[Body&Mind]]></Style> </Styles> </Training> <Time Duration="PT1H15M">2017-03-30T13:30:00</Time> <Instructors> <Instructor Id="3" Rating="4.6"> <Name><![CDATA[Minnie Mouse]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="2" GroupSize="30"> <Venue Id="3">Hall 3</Venue> <Training Id="2" Licence="LesMills"> <Name><![CDATA[BodyBalance™]]></Name> <Styles> <Style StyleId="2"><![CDATA[Body&Mind]]></Style> </Styles> </Training> <Time Duration="PT1H15M">2017-03-31T12:15:00</Time> <Instructors> <Instructor Id="2" Rating="4.7"> <Name><![CDATA[Mickey Mouse]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="4" GroupSize="30"> <Venue Id="3">Hall 3</Venue> <Training Id="3" Licence="LesMills"> <Name><![CDATA[BodyJam™]]></Name> <Styles> <Style StyleId="4"><![CDATA[Dance&Fun]]></Style> <Style StyleId="1"><![CDATA[Cardio]]></Style> </Styles> </Training> <Time Duration="PT60M">2017-03-30T16:10:00</Time> <Instructors> <Instructor Id="4" Rating="4.2"> <Name><![CDATA[Donald Duck]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="5" GroupSize="20"> <Venue Id="5">Hall 5</Venue> <Training Id="3" Licence="LesMills"> <Name><![CDATA[BodyJam™]]></Name> <Styles> <Style StyleId="4"><![CDATA[Dance&Fun]]></Style> <Style StyleId="1"><![CDATA[Cardio]]></Style> </Styles> </Training> <Time Duration="PT45M">2017-04-01T12:00:00</Time> <Instructors> <Instructor Id="5" Rating="3.9"> <Name><![CDATA[Goofy]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="7" GroupSize="45"> <Venue Id="1">Main Hall</Venue> <Training Id="4" Licence="LesMills"> <Name><![CDATA[BodyPump™]]></Name> <Styles> <Style StyleId="3"><![CDATA[Strength]]></Style> </Styles> </Training> <Time Duration="PT60M">2017-03-23T13:00:00</Time> <Instructors> <Instructor Id="6" Rating="5"> <Name><![CDATA[Arnold Schwarzenegger]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="6" GroupSize="45"> <Venue Id="1">Main Hall</Venue> <Training Id="4" Licence="LesMills"> <Name><![CDATA[BodyPump™]]></Name> <Styles> <Style StyleId="3"><![CDATA[Strength]]></Style> </Styles> </Training> <Time Duration="PT60M">2017-03-30T13:00:00</Time> <Instructors> <Instructor Id="6" Rating="5"> <Name><![CDATA[Arnold Schwarzenegger]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="8" GroupSize="10"> <Venue Id="6">Area 6</Venue> <Training Id="5"> <Name><![CDATA[CoreStrength]]></Name> <Styles> <Style StyleId="3"><![CDATA[Strength]]></Style> </Styles> </Training> <Time Duration="PT2H">2017-03-23T12:00:00</Time> <Instructors> <Instructor Id="9" Rating="5"> <Name><![CDATA[Margaret Strengthener]]></Name> </Instructor> </Instructors> <Comment><![CDATA[ Special challenge! ]]></Comment> </ScheduleItem> <ScheduleItem Id="9" GroupSize="15"> <Venue Id="6">Area 6</Venue> <Training Id="5"> <Name><![CDATA[CoreStrength]]></Name> <Styles> <Style StyleId="3"><![CDATA[Strength]]></Style> </Styles> </Training> <Time Duration="PT60M">2017-03-30T12:00:00</Time> <Instructors> <Instructor Id="8" Rating="4.8"> <Name><![CDATA[Kayla Weightlifter]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="10" GroupSize="15"> <Venue Id="6">Area 6</Venue> <Training Id="5"> <Name><![CDATA[CoreStrength]]></Name> <Styles> <Style StyleId="3"><![CDATA[Strength]]></Style> </Styles> </Training> <Time Duration="PT60M">2017-04-05T12:00:00</Time> <Instructors> <Instructor Id="8" Rating="4.8"> <Name><![CDATA[Kayla Weightlifter]]></Name> </Instructor> <Instructor Id="9" Rating="5"> <Name><![CDATA[Margaret Strengthener]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="11" GroupSize="30"> <Venue Id="2">Hall 2</Venue> <Training Id="6"> <Name><![CDATA[Zumba®]]></Name> <Styles> <Style StyleId="4"><![CDATA[Dance&Fun]]></Style> </Styles> </Training> <Time Duration="PT55M">2017-03-26T15:00:00</Time> <Instructors> <Instructor Id="7" Rating="4.2"> <Name><![CDATA[Arnold Zumbaschnegger]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="12" GroupSize="20"> <Venue Id="4">Hall 4</Venue> <Training Id="6"> <Name><![CDATA[Zumba®]]></Name> <Styles> <Style StyleId="4"><![CDATA[Dance&Fun]]></Style> </Styles> </Training> <Time Duration="PT60M">2017-03-28T12:00:00</Time> <Instructors> <Instructor Id="7" Rating="4.2"> <Name><![CDATA[Arnold Zumbaschnegger]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="13" GroupSize="30"> <Venue Id="2">Hall 2</Venue> <Training Id="6"> <Name><![CDATA[Zumba®]]></Name> <Styles> <Style StyleId="4"><![CDATA[Dance&Fun]]></Style> </Styles> </Training> <Time Duration="PT60M">2017-03-30T12:00:00</Time> <Instructors> <Instructor Id="7" Rating="4.2"> <Name><![CDATA[Arnold Zumbaschnegger]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="1" GroupSize="30"> <Venue Id="7">Yoga Hall</Venue> <Training Id="1"> <Name><![CDATA[Yoga]]></Name> <Styles> <Style StyleId="2"><![CDATA[Body&Mind]]></Style> </Styles> </Training> <Time Duration="PT60M">2017-03-25T14:00:00</Time> <Instructors> <Instructor Id="1" Rating="5"> <Name><![CDATA[Minnie Yogafier]]></Name> </Instructor> </Instructors> </ScheduleItem> <ScheduleItem Id="14" GroupSize="15"> <Venue Id="7">Yoga Hall</Venue> <Training Id="1"> <Name><![CDATA[Yoga]]></Name> <Styles> <Style StyleId="2"><![CDATA[Body&Mind]]></Style> </Styles> </Training> <Time Duration="PT1H20M">2017-03-28T14:00:00</Time> <Instructors> <Instructor Id="1" Rating="5"> <Name><![CDATA[Minnie Yogafier]]></Name> </Instructor> </Instructors> <Comment><![CDATA[ Special class! ]]></Comment> </ScheduleItem> </Schedule>
Log
- 03.03.17 Esimene kohtumine. Idee.
- 17.03.17 Osa XMList valmis, osa XSLT-st valmis
- 18.03.17 Teine kohtumine. XMLi täiendamine, esimene ülekäimine XSD-s.
- 19.03.17 XML/XSLT/XSD täiendamine ja lõpetamine.