Harjutus: XML Reisid

Loon SQL Serveris andmetabeli reisi kohta. Tabeli andmete (30) genereerimiseks /täitmiseks kasutan https://www.mockaroo.com/

Genereeritud SQL taotlus:

CREATE TABLE Reisid (
    id INT PRIMARY KEY,
    reisi_number VARCHAR(50),
    lennufirma VARCHAR(100),
    sihtkoht VARCHAR(100),
    valjumis_lennujaam VARCHAR(100),
    saabumis_lennujaam VARCHAR(100),
    algus_aeg VARCHAR(10),
    loppu_aeg VARCHAR(10),
    hind DECIMAL(10,2)
);
INSERT INTO Reisid (id, reisi_number, lennufirma, sihtkoht, valjumis_lennujaam, saabumis_lennujaam, algus_aeg, loppu_aeg, hind) VALUES
(1, '0093-5289', 'Marcq Airlines', 'Amsterdam', 'Salem Leckrone Airport', 'New Chitose Airport', '10:15', '12:45', 7.99),
(2, '52584-950', 'Escoffrey Air', 'New York', 'Inongo Airport', 'Havadarya Airport', '07:45', '10:00', 4.99),
(3, '12745-177', 'Treacher Flights', 'Seoul', 'Erbil International Airport', 'Tulcea Airport', '20:30', '21:00', 109.99),
(4, '36987-2693', 'Giscken Airways', 'Chicago', 'Ginbata Airport', 'Ocean City Municipal Airport', '16:30', '09:45', 12.99),
(5, '21695-791', 'Duckhouse Travel', 'Paris', 'Mazar I Sharif Airport', 'Stafsberg Airport', '20:45', '17:15', 19.99),
(6, '46084-111', 'Gertray Express', 'Seoul', 'Namsang Airport', 'Cape Romanzof LRRS Airport', '18:45', '19:15', 2.89),
(7, '0009-5014', 'Brocklesby Air', 'Chicago', 'Butterworth Airport', 'Bislig Airport', '19:30', '09:45', 39.99),
(8, '54868-4665', 'Medina Airlines', 'Lima', 'Koltsovo Airport', 'Floyd Bennett Memorial Airport', '13:00', '17:15', 89.99),
(9, '59762-0489', 'Nehls Jet', 'Buenos Aires', 'Viru Harbour Airstrip', 'Tableland Homestead Airport', '10:15', '09:00', 12.99),
(10, '68428-041', 'Degli Abbati Air', 'Mumbai', 'Osaka International Airport', 'Springvale Airport', '07:15', '19:45', 12.99),
(11, '53807-409', 'Schindler Lines', 'Mumbai', 'Mandalgobi Airport', 'Bachigualato Federal International Airport', '19:45', '18:30', 39.99),
(12, '59915-4001', 'Rochford Air', 'Melbourne', 'Orlando International Airport', 'Bhuj Airport', '18:45', '15:15', 27.99),
(13, '13985-529', 'Currell Airways', 'Paris', 'Saint John Airport', 'Watertown Regional Airport', '15:30', '08:00', 39.99),
(14, '13537-299', 'Ingledew Express', 'Hong Kong', 'Incheon International Airport', 'Emmen Air Base', '13:15', '15:00', 3.99),
(15, '0703-5775', 'Rospars Travel', 'Paris', 'Rendani Airport', 'N''Délé Airport', '12:30', '14:15', 24.99),
(16, '68788-9945', 'Freezor Air', 'Atlanta', 'Malatya Erhaç Airport', 'Lolland Falster Maribo Airport', '07:15', '19:15', 29.99),
(17, '68084-086', 'Petheridge Flights', 'Delhi', 'Cenej Airport', 'Pocatello Regional Airport', '20:15', '20:15', 149.99),
(18, '54569-0235', 'Belleny Airways', 'Paris', 'Southeast Iowa Regional Airport', 'Pula Airport', '06:45', '19:00', 39.99),
(19, '43063-517', 'Bramer Air', 'Hong Kong', 'Uttaradit Airport', 'Hiroshima Airport', '06:30', '10:30', 5.49),
(20, '75939-9876', 'Royden Flights', 'Frankfurt', 'Leeward Point Field', 'Franklin Municipal-John Beverly Rose Airport', '09:30', '10:45', 2.29),
(21, '54569-6240', 'Kolczynski Air', 'Chicago', 'Jinzhou Airport', 'Fresno Chandler Executive Airport', '13:15', '21:00', 69.99),
(22, '52389-154', 'Havill Express', 'New York', 'Sundsvall-Härnösand Airport', 'Fuvahmulah Airport', '14:15', '21:15', 19.99),
(23, '21695-605', 'Glavin Airlines', 'Paris', 'Sultan Mahmud Badaruddin II Airport', 'Points North Landing Airport', '09:00', '19:15', 12.99),
(24, '48951-8248', 'Jurisch Travel', 'Paris', 'Warukin Airport', 'Mooraberree Airport', '20:45', '13:00', 22.99),
(25, '23155-214', 'Cattanach Jet', 'Munich', 'Quonset State Airport', 'Ketchikan Harbor Seaplane Base', '12:15', '20:00', 39.99),
(26, '45737-250', 'Golsby Airways', 'Frankfurt', 'Betoota Airport', 'Lekoni Airport', '14:00', '10:30', 4.49),
(27, '55111-556', 'Pellitt Flights', 'Paris', 'Mareeba Airport', 'Decatur HI-Way Airfield', '08:30', '08:30', 59.99),
(28, '50268-816', 'Jouannot Express', 'Paris', 'Kunua Airport', 'Bushehr Airport', '20:45', '11:30', 7.99),
(29, '62670-4321', 'Shipman Air', 'Paris', 'Curitibanos Airport', 'Lewoleba Airport', '10:45', '11:00', 49.99),
(30, '55301-500', 'Baselio Airlines', 'Paris', 'Turaif Domestic Airport', 'Argyle International Airport', '19:00', '19:15', 59.99);

Tulemus:

Loon kolmetasemeline XML:

XML-faili loomise taotlus

SELECT  
    id AS "@id",  
    reisi_number AS "@reisi_number",  
    lennufirma AS "Lennufirma",  
    sihtkoht AS "Sihtkoht",  
    (  
        SELECT  
            algus_aeg AS "@algus_aeg",  
            loppu_aeg AS "@loppu_aev",  
            valjumis_lennujaam AS "Valjumine",  
            saabumis_lennujaam AS "Saabumine"  
        FOR XML PATH('Lennujaamad'), TYPE  
    ),  
    (  
        SELECT  
            hind AS "@value"  
        FOR XML PATH('Hind'), TYPE  
    )  
FROM Reisid  
FOR XML PATH('Reis'), ROOT('Reisid');

XML fail:

Harjutused

1.Kuvada iga reisi sihtkoht pealkirjana, kasutades <h1>.

<xsl:for-each select="/Reisid/Reis">
	<h1>
		<xsl:value-of select="Sihtkoht"></xsl:value-of>
	</h1>
</xsl:for-each>

2. Komponendid peavad olema kuvatud täpploeteluna (<ul>).

<xsl:for-each select="Reis">
	<ul>
		<li>ID: <xsl:value-of select="@id"/></li>
		<li>Reisi number: <xsl:value-of select="@reisi_number"/></li>
		<li>Lennufirma: <xsl:value-of select="Lennufirma"/></li>
		<li>Sihtkoht: <xsl:value-of select="Sihtkoht"/></li>
		<li>Algus aeg: <xsl:value-of select="Lennujaamad/@algus_aeg"/></li>
		<li>Lõppu aeg: <xsl:value-of select="Lennujaamad/@loppu_aev"/></li>
		<li>Valjumine: <xsl:value-of select="Lennujaamad/Valjumine"/></li>
		<li>Saabumine: <xsl:value-of select="Lennujaamad/Saabumine"/></li>
		<li>Hind: <xsl:value-of select="Hind/@value"/></li>
	</ul>
</xsl:for-each>

3. Kolmanda taseme struktuuri andmed tuleb kuvada kollasel taustal.

<xsl:for-each select="Reis">
	<ul>
		<li>ID: <xsl:value-of select="@id"/></li>
		<li>Reisi number: <xsl:value-of select="@reisi_number"/></li>
		<li>Lennufirma: <xsl:value-of select="Lennufirma"/></li>
		<li>Sihtkoht: <xsl:value-of select="Sihtkoht"/></li>
		<li>Algus aeg: <xsl:value-of select="Lennujaamad/@algus_aeg"/></li>
		<li>Lõppu aeg: <xsl:value-of select="Lennujaamad/@loppu_aev"/></li>
		<li>
			Valjumine:
			<span style="background-color:yellow">
				<xsl:value-of select="Lennujaamad/Valjumine"/>
			</span>
		</li>
		<li>
			Saabumine:
			<span style="background-color:yellow">
				<xsl:value-of select="Lennujaamad/Saabumine"/>
			</span>
		</li>
		<li>Hind: <xsl:value-of select="Hind/@value"/></li>
	</ul>
</xsl:for-each>

4. Lisa oma tingimus (nt reisi hind või eriline soovitus peab olema esile tõstetud teatud tingimustel).

<li>
				Hind:
				<xsl:choose>
					<xsl:when test="Hind/@value < 5">
						<span style="background-color:green; font-weight:bold">
							<xsl:value-of select="Hind/@value"/>
						</span>
					</xsl:when>
					<xsl:otherwise>
						<span style="background-color:red; font-weight:bold">
							<xsl:value-of select="Hind/@value"/>
						</span>
					</xsl:otherwise>
				</xsl:choose>
</li>

5. Kuva iga reisi kogumaksumuse, liites transport, majutuse, ekskursioonide ja muude kulude hinnad kokku.

Muudatud andmed

<Reis id="1" reisi_number="0093-5289">
    <Lennufirma>Marcq Airlines</Lennufirma>
    <Sihtkoht>Amsterdam</Sihtkoht>
    <Lennujaamad algus_aeg="10:15" loppu_aev="12:45">
	    <Valjumine>Salem Leckrone Airport</Valjumine>
	    <Saabumine>New Chitose Airport</Saabumine>
    </Lennujaamad>
    <Transport value="100"/>
    <Majutus value="250"/>
    <Ekskursioonid value="50"/>
    <MuudKulud value="30"/>
    <Hind value="7.99"/>
</Reis>

Tsükli sees arvutame summa avaldise abil:

<li>
				Muu maksud:
				<ul>
					<li>
						Transpordi hind: <xsl:value-of select="Transport/@value"/>
					</li>
					<li>
						Majutus: <xsl:value-of select="Majutus/@value"/>
					</li>
					<li>
						Ekskursioon: <xsl:value-of select="Ekskursioonid/@value"/>
					</li>
					<li>
						Muu: <xsl:value-of select="MuudKulud/@value"/>
					</li>
				</ul>
</li>
<xsl:variable name="kogumaksumus"
          select="number(Transport/@value) 
                + number(Majutus/@value) 
                + number(Ekskursioonid/@value) 
                + number(MuudKulud/@value)"/>
<li>
				Kogumaksumus: <xsl:value-of select="$kogumaksumus"/>
</li>

6. Filtreeri ja kuva ainult need reisid, mille transport sisaldab lennureisi.

Minu andmetes on ainult lennu reisid, selle ülesande jaoks lisan ka teisi tüüpe

Uus anmed:

<Reis id="1" reisi_number="0093-5289">
	<Lennufirma>Marcq Airlines</Lennufirma>
	<Sihtkoht>Amsterdam</Sihtkoht>
	<Lennujaamad algus_aeg="10:15" loppu_aev="12:45">
		<Valjumine>Salem Leckrone Airport</Valjumine>
		<Saabumine>New Chitose Airport</Saabumine>
	</Lennujaamad>
	<Transport type="lennureis" value="100"/>
	<Majutus value="250"/>
	<Ekskursioonid value="50"/>
	<MuudKulud value="30"/>
	<Hind value="7.99"/>
</Reis>

<Reis id="2" reisi_number="52584-950">
	<Lennufirma>Escoffrey Air</Lennufirma>
	<Sihtkoht>New York</Sihtkoht>
	<Lennujaamad algus_aeg="07:45" loppu_aev="10:00">
		<Valjumine>Inongo Airport</Valjumine>
		<Saabumine>Havadarya Airport</Saabumine>
	</Lennujaamad>
	<Transport type="rong" value="40"/>
	<Majutus value="120"/>
	<Hind value="4.99"/>
</Reis>

<Reis id="3" reisi_number="12745-177">
	<Lennufirma>Treacher Flights</Lennufirma>
	<Sihtkoht>Seoul</Sihtkoht>
	<Lennujaamad algus_aeg="20:30" loppu_aev="21:00">
		<Valjumine>Erbil International Airport</Valjumine>
		<Saabumine>Tulcea Airport</Saabumine>
	</Lennujaamad>
	<Transport type="buss" value="25"/>
	<Majutus value="90"/>
	<Hind value="109.99"/>
</Reis>

Uus select:

<xsl:for-each select="Reis[Transport/@type='lennureis']">

Uus andmeloendi rida:

<li>Tüüp: <xsl:value-of select="Transport/@type"/> </li>

7. Sorteeri kõik reisid vastavalt hinnangule (nt kliendihinnang, kui selline väli on olemas XML-is, kui ei ole kasuta teine numbriline väli).

<xsl:sort select="number(Hind/@value)" data-type="number" order="descending"/>

Lõplik XSLT kood (harjutus 1-7):

<xsl:for-each select="Reis">
	<xsl:sort select="number(Hind/@value)" data-type="number" order="descending"/>
	<h5>
		<xsl:value-of select="Sihtkoht"/>
	</h5>
	<ul>
		<li>ID: <xsl:value-of select="@id"/></li>
		<li>Reisi number: <xsl:value-of select="@reisi_number"/></li>
		<li>Tüüp: <xsl:value-of select="Transport/@tuup"/> </li>
		<li>Firma: <xsl:value-of select="Firma"/></li>
		<li>Sihtkoht: <xsl:value-of select="Sihtkoht"/></li>
		<li>Kestus: <xsl:value-of select="Lennujaamad/@kestus"/></li>
		<li>
			Väljumine:
			<span style="background-color:yellow">
				<xsl:value-of select="Lennujaamad/Valjumine"/>
			</span>
		</li>
		<li>
			Saabumine:
			<span style="background-color:yellow">
				<xsl:value-of select="Lennujaamad/Saabumine"/>
			</span>
		</li>
		<li>
			Hind:
			<xsl:choose>
				<xsl:when test="Hind/@value < 5">
					<span style="background-color:green; font-weight:bold">
						<xsl:value-of select="Hind/@value"/>
					</span>
				</xsl:when>
				<xsl:otherwise>
					<span style="background-color:red; font-weight:bold">
						<xsl:value-of select="Hind/@value"/>
					</span>
				</xsl:otherwise>
			</xsl:choose>
		</li>
		<li>
			Muu maksud:
			<ul>
				<li>
					Transpordi hind: <xsl:value-of select="Transport/@value"/>
				</li>
				<li>
					Majutus: <xsl:value-of select="Majutus/@value"/>
				</li>
				<li>
					Ekskursioon: <xsl:value-of select="Ekskursioonid/@value"/>
				</li>
				<li>
					Muu: <xsl:value-of select="MuudKulud/@value"/>
				</li>
			</ul>
		</li>
		<xsl:variable name="kogumaksumus"
	              select="number(Transport/@value) 
	                    + number(Majutus/@value) 
	                    + number(Ekskursioonid/@value) 
	                    + number(MuudKulud/@value)"/>
		<li>
			Kogumaksumus: <xsl:value-of select="$kogumaksumus"/>
		</li>
	</ul>
</xsl:for-each>

Lõplik XML struktuur:

<Reis id="1" reisi_number="0093-5289">
	<Firma>Marcq Airlines</Firma>
	<Sihtkoht>Amsterdam</Sihtkoht>
	<Lennujaamad kestus="3:15">
		<Valjumine>Salem Leckrone Airport</Valjumine>
		<Saabumine>Schiphol Airport</Saabumine>
	</Lennujaamad>
	<Transport tuup="Lennureis" value="100"/>
	<Majutus value="250"/>
	<Ekskursioonid value="50"/>
	<MuudKulud value="30"/>
	<Hind value="7.99"/>
</Reis>

8. Kuva kõik xml andmed tabelina, kus read on üle rea erineva värviga.

Tabeli kood:

<html>
	<head>
		<style>
			table, th, td {
			border: 1px solid black;
			border-collapse: collapse;
			padding: 3px;
			}
		</style>
	</head>
	<body>
		<table>
			<tr>
				<th>ID</th>
				<th>Reisi number</th>
				<th>Tüüp</th>
				<th>Firma</th>
				<th>Sihtkoht</th>
				<th>Kestus</th>
				<th>Väljumine</th>
				<th>Saabumine</th>
				<th>Hind</th>
				<th>Kogumaksumus</th>
			</tr>
			<xsl:for-each select="Reis">
				<xsl:variable name="pos" select="position()"/>
				<xsl:variable name="r" select="$pos * 40 mod 256"/>
				<xsl:variable name="g" select="$pos * 80 mod 256"/>
				<xsl:variable name="b" select="$pos * 120 mod 256"/>
				<tr>
					<xsl:attribute name="style">
						<xsl:text>background-color:rgb(</xsl:text>
						<xsl:value-of select="$r"/>
						<xsl:text>,</xsl:text>
						<xsl:value-of select="$g"/>
						<xsl:text>,</xsl:text>
						<xsl:value-of select="$b"/>
						<xsl:text>);</xsl:text>
					</xsl:attribute>
					
					<td><xsl:value-of select="@id"/></td>
					<td><xsl:value-of select="@reisi_number"/></td>
					<td><xsl:value-of select="Transport/@tuup"/></td>
					<td><xsl:value-of select="Firma"/></td>
					<td><xsl:value-of select="Sihtkoht"/></td>
					<td><xsl:value-of select="Lennujaamad/@kestus"/></td>
					<td><xsl:value-of select="Lennujaamad/Valjumine"/></td>
					<td><xsl:value-of select="Lennujaamad/Saabumine"/></td>
					<td><xsl:value-of select="Hind/@value"/></td>
					<td>
						<xsl:variable name="kogumaksumus"
						select="number(Transport/@value) 
								+ number(Majutus/@value) 
								+ number(Ekskursioonid/@value) 
								+ number(MuudKulud/@value)"/>
						<xsl:value-of select="$kogumaksumus"/>
					</td>
				</tr>
			</xsl:for-each>
		</table>
	</body>
</html>

Tulemus:

XML skeem

Reisid.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="Reisid">
		<xs:complexType>
			<xs:sequence>
				<xs:element maxOccurs="unbounded" name="Reis">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Firma" type="xs:string" />
							<xs:element name="Sihtkoht" type="xs:string" />
							<xs:element name="Lennujaamad">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="Valjumine" type="xs:string" />
										<xs:element name="Saabumine" type="xs:string" />
									</xs:sequence>
									<xs:attribute name="kestus" type="xs:string" use="required" />
								</xs:complexType>
							</xs:element>
							<xs:element name="Transport">
								<xs:complexType>
									<xs:attribute name="tuup" type="xs:string" use="required" />
									<xs:attribute name="value" type="xs:unsignedShort" use="required" />
								</xs:complexType>
							</xs:element>
							<xs:element name="Majutus">
								<xs:complexType>
									<xs:attribute name="value" type="xs:unsignedShort" use="required" />
								</xs:complexType>
							</xs:element>
							<xs:element name="Ekskursioonid">
								<xs:complexType>
									<xs:attribute name="value" type="xs:unsignedShort" use="required" />
								</xs:complexType>
							</xs:element>
							<xs:element name="MuudKulud">
								<xs:complexType>
									<xs:attribute name="value" type="xs:unsignedByte" use="required" />
								</xs:complexType>
							</xs:element>
							<xs:element name="Hind">
								<xs:complexType>
									<xs:attribute name="value" type="xs:decimal" use="required" />
								</xs:complexType>
							</xs:element>
						</xs:sequence>
						<xs:attribute name="id" type="xs:unsignedByte" use="required" />
						<xs:attribute name="reisi_number" type="xs:string" use="required" />
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

XML-failile viide XSD-failile

<Reisid xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="Reisid.xsd">

Kolm oma ülesanned

1.Sorteerin tabeli hinna järgi kasvavas järjekorras.

<xsl:sort select="number(Hind/@value)" data-type="number" order="ascending"/>

2.Arvuta kõigi sõitude keskmine Transport/@value ja kuva see tabelis eraldi reas.

<xsl:variable name="sum" select="sum(Reis/Transport/@value)"/>
<xsl:variable name="count" select="count(Reis)"/>
<h2>
				Keskmine transpordi hind: <xsl:value-of select="$sum div $count"/>
</h2>

3. Tõsta tabelis punasega esile kõik reisid, kus Hind/@value > 50, jäta ülejäänud read valgeks.

<xsl:if test="Hind/@value > 50">
				<xsl:attribute name="style">background-color:lightcoral;</xsl:attribute>
</xsl:if>

Lõppu tulemus

GITHUB: https://github.com/AI1322/Reisid-ASP.NET/tree/master

Scroll to Top