Tekstifunktsioonid XSLis
Asukoha järgi saab andmeid XSLi abil XMList ilusti välja võtta. Et kui
soovitakse küsida kolmanda inimese eesnimi, siis kirjutatakse
/inimesed/inimene[3]/eesnimi sobivasse kohta, näiteks xsl:value-of elemendi
select-parameetriks.
Kui soovitakse aga nimest vaid esitähte, siis võib kirjutada
Esitäht:
Funktsioonile substring tuleb ette anda otsitav tekst ning kaks arvu: mitmendast
tähest alates ning mitu tähte väljastada.
Funktsiooni enese kuju
substring(s1, start, nr?)
Järgnevalt siis mõned levinumad sõnefunktsioonid:
concat(s1, s2, s3*)
Parameetritena antud tekstid liidetakse. Elementide arv ei ole piiratud.
Üldjuhul saab hakkama ka ilma seda funktsioonid kasutamata, pannes lihtsalt
järjestikku vajalikke xsl:value-of elemente ning tekste. Aga mõnikord on concati
abil andmeid lühem reastada. Näiteks initsiaalide tarbeks
Ehk siis concati sees komadega eraldatult eesnime esitäht, punkt (tekstina
esitamiseks ülakomade vahel), siis perekonnanime esitäht ning sellele järgnev
punkt.
annab tulemuseks "muna". Mõlema funktsiooni kujud näevad välja järgnevalt,
teine lihtsalt annab välja eraldajale järgneva osa.
substring-before(s1, s2)
substring-after(s1, s2)
Pea igas programmeerimiskeeles on käsklus teksti pikkuse küsimiseks. Nii ka
siin.
string-length(s1)
ehk siis näitena
annab tulemuseks arvu 4.
normalize-space(s1)
Võtab algusest ja otstest tühikud, muud vahed teeb üheks tühikuks. Kasulik
näiteks erikujuliste sisestatud tekstide võrdlemisel või lihtsalt väljundi
viisakamaks muutmisel. XMLi andmete juures ei mängi korduvad tühikud rolli, küll
aga neist võib tüli tekkida mõnda muusse kohta suunduva väljundi puhul.
translate (s1, algsümbolid, lõppsümbolid)
Tähtede asendamiseks leiab harjumatu kujuga funktsiooni. Näite järgi on aga ehk
toimimine mõistetav: translate('pann', 'an', 'ek') -> 'pekk'
Ülesandeid
* Koosta XML-andmefail, kus on kirjas auto registrinumber ning omaniku
perekonnanimi
* Trüki välja auto registrinumber
* Trüki välja auto registrinumbri numbrite osa
* Trüki välja auto registrinumbri tähtede osa
* Trüki välja inimese perekonnanime esimene täht
* Trüki välja inimese perekonnanime viimane täht
Loendamine
Vastuse küsimusele, mitu elementi vastab soovitud otsingule, annab funktsioon
count. Näiteks inimeste arvu saab kokku järgnevalt:
Inimeste arv:
Tahtes kokku loendada kõiki inimesi, kelle eesnimi on Juku, tuleb vastav piirang
kirjutada inimese taha kandiliste sulgude sisse.
Jukude arv:
Saab võrrelda ka suurem ja väikesem olemist. Vastavad võrdlused aga on viisakas
kirjutada XMLi jaoks sobivate märgikombinatsioonidena. "Väiksem kui" oleks siis
kujul < (less than) ning "suurem kui" kujul > (greater than).
Enne Moskva olümpiat sündinud:
Ülesandeid
* Koosta/otsi XML-andmefail, kus on kirjas auto registrinumber ning omaniku
perekonnanimi
* Leia, mitme inimese perekonnanimi on Kaalikas
* Leia, mitme inimese perekonnanimi algab M-tähega
* Leia, mitme auto registrimärgi numbritest viimane on 2
* Leia, mitme auto registrimärgi numbritest viimane on 1 või 2
Tingimused
Programmeerimise juures on võimalik tingimusele vastavalt midagi teha või
tegemata jätta. Nii ka siin. Tavalise valiku tarvis on käsklus xsl:if. Näide:
Esimene nimi algab jotiga
Kui tingimus vastab tõele, siis sealne tekst trükitakse, muidu mitte. Käsu kuju
siis
starts-with(s1, s2)
ning selgitus
Kontrollitakse, kas esimesena antud tekst algab teisena antud tekstiga.
Mõnevõrra sarnane funktsioon on
contains(s1, s2)
Võrreldes eelmisega ei pruugita alustada algusest, vaid otsitakse lõigu leidmist
kogu teksti ulatuses.
Tõeväärtuse saab vastuspidiseks pöörata funktsiooniga not(), eraldi else-lauset
ei ole.
Esimene nimi ei alga a-ga
Tingimuseks sobivad ka igasugu võrdlused, mille vastuseks on "jah" või "ei".
Näiteks, et kas teksti pikkus on väiksem kui viis sümbolit. Märk "on väiksem
kui" ehk "<" kirjutatakse kujul < (less than), sest nii vastab see XMLi
süntaksile (millele XSL leht peab töötamiseks vastama. Näiteks
Lühike nimi
Ülesandeid
* Koosta/leia XML-andmefail, kus on kirjas auto registrinumber ning omaniku
perekonnanimi
* Kui registrimärgi viimane number on 5, siis teata, et ülevaatuse kuu on juuli
* Teata iga registrinumbri puhul, millises kuus auto ülevaatusele peab minema.
* Kui perekonnanimes sisaldub täht x, siis teata, et tegemist on võõrnimega.
* Muul juhul teata, et tegemist pole võõrnimega.
Kordused
Kui samatüübilisi andmeid on palju, siis tulevad appi kordused. Nii ka XSLi
juures. Tsükli loomiseks sobib käsklus xsl:for-each, select-parameetrina antakse
ette elemendid mille kontekstis ploki sisu korrata. Et tööd alustatakse
juurelemendile vastavast mallist
ning sealt seest küsitakse kõiki elemente, mis vastavad mustrile
inimesed/inimene, siis saadakse kätte algsest failist kõik viis inimest, kes on
pöördutavad kujul /inimesed/inimene.
Tsükli sees on igal korral jooksvaks elemendiks juba konkreetne inimene.
Esimesel korral siis näiteks
Juku
Juurikas
1963
Seal saab juba otse pöörduda alamelementide poole. Ehk siis
annab vastuseks Juku. Ning iga järgmise ringi juures juba järgmise inimese
eesnime.
Käivitades XSL-lehe koos andmefailiga saame tulemuse arvatavasti kujul
JukuJukuKalleMariOskar
Tahtes nimede vahele tühikuid saada, sobib abielemendina xsl:text, mis lubab
elemendi alguse ja lõpu vahele kirjutatud teksti otse väljundisse saata.
Annab siis tulemuseks
Juku Juku Kalle Mari Oskar
Kui aga juba HTMLi sisse andmete kirjutamiseks läheb, siis pole otsesed tühikud
ja reavahetused kuigi tähtsad - loeb lihtsalt nende olemasolu või puudumine,
mitte kogus. Kujundamiseks on aga seal juba omad käsud. Näiteks loetelu jaoks
tavapärane komplekt kogu loetelu tähistamiseks ning - üksiku elemendi
tarbeks. Need saab rahumeeli XSLi faili sisse panna.
Tulemusena võib ilusti vormindatud tulemust imetleda.
- Juku
- Juku
- Kalle
- Mari
- Oskar
Sama tulemuse saab programmide puhul ikka mitmel moel kätte. Eelnenud näites
öeldi xsl:for-eachi juures, et läbi tuleb käia kõik elemendid nimega inimene
ning xsl:value-ofi juures määrati, et näha soovitakse inimese seest eesnime.
Järgnevas näites saadakse sama tulemus nõnda, et juba xsl:for-eachi juures
käiakse läbi kõikide inimeste eesnimed. Ning xsl:value-ofi juures pole muud vaja
öelda, kui et tuleb kuvada jooksva elemendi (mida tähistatakse punktiga)
väärtus.
Ehkki XSL pole mõeldud suuremamahulisteks arvutusteks ja tekstitöötluseks,
õnnestub lihtsamad võrdlused ja kokkuvõtted siin täiesti teha. Järgnevalt siis
loetelu nende inimeste perekonnanimedest, kelle eesnimi algab J-iga. Algandmete
peale vaadates leiame sealt kaks Jukut: üks Juurikas ning teine Kaalikas.
Vastavad perekonnanimed saadakse jätte järgneva avaldise abil.
Kandiliste sulgude sees määratakse ära, millistele tingimustele vastavaid
inimesi loetellu võetakse. Siin juhul siis kontrolliks XSLi funktsioon nimega
starts-with, parameetriteks kontrollitav tekst ning otsitav algustekst. Ning
nagu muud tõeväärtusfunktsioonid, nii ka siin on väärtuseks jah või ei. Ning
loetellu jäävad need inimesed, kel avaldise puhul väärtuseks jah. Ning nõnda
saab tsükli sees otsitud tulemused välja kirjutada.
;
Käivitamine nii nagu eelnenud näite puhul
E:\kasutaja\jaagup\xml>java XSLMuundur inimesed.xml inimesed4.xsl inimesed4.txt
Ning faili sisu piiludes võime just soovitud read selle seest avastada.
E:\kasutaja\jaagup\xml>more inimesed4.txt
Juurikas;
Kaalikas;
Plokifunktsioone
Kui tsükli abil plokis liikuda, siis tuleb vahel kasuks teada, mitmendal ringil
parajasti ollakse ning mitu ringi kokku on. Vastavad abiks olevad funktsioonid
on järgnevad:
last() viimase järjekorranumber
position() jooksva järjekorranumber
Ehk siis järgnevas näites trükitakse iga eesnime ette tema järjekorranumber.
Käsklus position() annab järjekorranumbri, concat seob ühte ritta kokku selle
numbri, sidekriipsu ning vastava inimese eesnime, kelle juures ollakse.
Väljund paistab välja järgnev:
- 1 - Juku
- 2 - Juku
- 3 - Kalle
- 4 - Mari
- 5 - Oskar
Kui tahta juurde määrata, et mitmes nimi mitmest, siis tuleb lisaks viimase
järjekorranumbrit näitav last().
Ning tulemus veebilehel järgmine:
* 1/5 - Juku
* 2/5 - Juku
* 3/5 - Kalle
* 4/5 - Mari
* 5/5 - Oskar
Ülesandeid
* Koosta/leia XML-andmefail, kus on kirjas autode registrinumbrid ning omaniku
perekonnanimed
* Trüki välja kõik perekonnanimed
* Lisa iga perekonnanime ette tema järjekorranumber
* Need read, kus registrinumbri viimane number lõppeb ühe või kahega trüki
rasvaselt.
Kujundus korduse sees
Lisaks nimede/andmete ettelugemisele on küllalt sageli vajalik/kasulik neid ka
vastavalt juurdekuuluvatele omadustele kujundada, et sobivaid ridu oleks kergem
üles leida. Tingimuslauseid, arvutusi ja muid käsklusi saab rahumeeli kasutada
ka korduse või korduste sees. Järgnevalt värvitakse hiljem kui 1980ndal aastal
sündinud inimeste eesnimed roheliseks. Tehakse eesnimele ümber span-plokk ning
sealse stiiliga määratakse nime värv. Ja kui tahta ka ülejäänud nimesid näidata,
ainult et tavaliste mustadena, siis üks moodus on loodud plokk lihtsalt
kopeerida, tingimusele ümberpöörav not-käsklus ümber panna ning nimele sobiv
värv määrata.
Tulemusena siis loetelu, kus iga nime juures märgitud värv.
-
Juku
-
Juku
-
Kalle
-
Mari
-
Oskar
Sama saab aga ka märgatavalt lühemalt kirja panna. Iseenesest pole ju nime
värvimiseks talle vaja eraldi span-elementi ümber panna. Piisab, kui nime
näitava elemendi - praegusel juhul li - stiilis on sobiv värv määratud. Käsklus
xsl:attribute võimaldabki juba alanud elemendi sisse atribuute lisada. Järgnevas
näites siis näha, et noorematele kui 1980ndal sündinutele pannakse
loeteluelemendile rohelise värvi atribuut külge.
Ning pärast käivitamist on see ilusti näha ka tulemuse juures.
- Juku
- Juku
- Kalle
- Mari
- Oskar
Pikemate ridade puhul on heaks tavaks mõned read ära värvida, et oleks parem
andmeid lugeda ja näpuga järge ajada. Reanumbri saame kätte käsuga position().
Nüüd, kui on tahtmine kindla arvu ridade tagant erivärviline rida luua, siis on
heaks abivahendiks jagamise jääk, modulus, ehk siin tehe nimega mod. Näitab, et
kui vasakul pool olev kogus jagada paremal pool olevaks arvuks võrdseteks
osadeks, mitu siis jääb üle. Kui näiteks kaksteist õuna jagada võrdselt neljale
lapsele, siis saab igaüks kolm õuna, ühtegi üle ei jää ehk jääk on null. Kui aga
on õunu kolmteist, siis üks õun jääb üle ehk jääk on üks. Neljateistkümne puhul
kaks, viieteistkümne puhul kolm ning kuusteist jagub taas neljaga, siis jääk
jälle null. Nii et kui tahaks iga neljanda rea teistsuguseks teha, siis piisaks
kontrollida, et kas jääk jagamisel neljaga on mingi kindel arv nendest
võimalikest jääkidest. Ühe puhul oleks värvitud kohe esimene rida, kahe puhul
teine, kolme puhul kolmas. Ning kõigepealt neljanda värvimiseks piisab
kontrollimast, kas jääk on null. Iga teise rea värvimiseks näiteks sobib järgnev
kood:
-
background-
color:lightgray
Ning tulemus veebilehe koodis on selline.
- Juku
- Juku
- Kalle
- Mari
- Oskar
Ülesandeid
* Koosta/leia XML-andmefail, kus on kirjas autode registrinumbrid ning omaniku
perekonnanimed
* Väljasta andmed tabelina: registrinumbrid ühes ning perekonnanimed teises
tulbas.
* Värvi ridade taustad üle ühe halliks.
* Värvi taustad nõnda, et järjestikku oleksid värvitu, hall ja kollane.
Mitu kordust samade andmetega
Tavaliselt käiakse andmed ühe korra läbi, näidatakse mis tarvis ja kogu lugu.
Aga vahel võib olla põhjust ka mitu korda samu andmeid läbi käia ning elementide
vahel seoseid leida ja välja märkida. Järgnevas näites luuakse tabel, kus nii
veergudes kui ridades on samad inimesed. Veergude ja ridade ristumiskohal aga
nende sünniaastate vahe - siis kohe näha, kes kui palju kellest vanem on. Kui
kordus määratakse juurelemendist alates, siis on selline sättimine lihtne -
piisab kaks for-each tsüklit üksteise sisse panna ning mõlemale määrata, et
tuleb läbi käia elemendid mustriga /inimesed/inimene. Veidi mõtlemist vajab
aastate vahe arvutus, sest sisemise inimese sünniaasta varjestab välimise oma
ära. Aitab aga, kui välimine element jätta eraldi muutujasse meelde. Siis saab
selle andmed ka sisemises plokis kätte ning võib nendega rahus toimetada.
Veebilehel väljund näha järgmine:
Inimeste vanuste vahe Juku, 1963 Juku, 1961 Kalle, 1975
Mari, 1981 Oskar, 1971
Juku 0 -2 12 18 8
Juku 2 0 14 20 10
Kalle -12 -14 0 6 -4
Mari -18 -20 -6 0 -10
Oskar -8 -10 4 10 0
Ülesandeid
* Pane näide käima
* Vähem kui viieaastase vanusevahega lahtrid näita teise värviga
* Kirjuta lahtritesse vastavate inimeste perekonnanimed. Nt. Kalle ja Mari
ristumiskohale tuleb "Kaalikas ja Maasikas"
* Võrreldes eelmisega jäta tühjaks need lahtrid, kus inimene kohtub iseenesega
(kõige viisakam kindlaks teha positsiooni järgi).
XSL eri struktuuriga andmefailidele
Eelnevad näited olid loodud kindlate elemendinimedega andmefaili seest väärtuste
kogumiseks ja esitamiseks. Vahel aga võivad andmefailid olla küll mõneti
sarnased, aga sugugi mitte samade elemendinimedega ja -kogustega. Tüüpiliseks
näiteks on mitmed algselt tabeli kujul olevad andmed, mis XML-i kujule viidud
ning mida hiljem sealt soov taas HTML- või mõne muu tabeli kujul esitada.
Sellisel juhul osutub kasulikuks käsklus name, mille abil saab etteantud ploki
nime küsida. Samuti on kasulik metamärk * (tärn), mis tähistab kõiki vastavas
kohas asuvaid alamelemente. Või kui küsida sellise alamelementide ploki nime,
siis antakse neist esimese nimi. Siin on allikaks sama inimeste fail. Käsklus
name(*) annab vastuseks "inimesed", kuna ollakse juure juures. Käsklus
name(*/*) väljastab "inimene", sest see on eelneva alamelement. Tegelikult
mustrile vastavad kõik elemendid "inimene", aga kuna küsitakse nime ainult ühe
kohta, siis väljastatakse esimese oma. Tahtes läbi käia esimese inimese kõik
alamelemendid, sobib tsükliks
Lahtiseletatult siis esimene tärn tähendab juures asuvat elementi "inimesed".
Järgmine *[1] on esimene inimene. Ning viimase tärni alt tulevad välja esimese
inimese eesnimi, perenimi ja synd. Tahtes saada elementide nimesid ja mitte
väärtusi, siis aitab taas käsklus name, sedakorda kujul
kus trükitakse välja parasjagu jooksva elemendi nimi. Kogu XSLi kood:
Juurelement:
Esimene alamelement:
Alamelemendi järglased:
Ning tulemuseks saadi siis järgnev HTML, kus võib veenduda, et kõik elemendid
õigesti kätte saadi.
Juurelement: inimesed
Esimene alamelement: inimene
Alamelemendi järglased:
Edasi tasub mõelda, et millisel kujul on soov andmeid esitada. Kui veebilehel ja
tabelina, siis on tabeli HTML-käsud igati asjakohased. Eelneva loetelu saab
vormistada tabeli tulpade pealkirjadena.
Ning väljund veebilehel on järgnev.
inimesed
Soovides lisaks pealkirjadele ka tegelikke andmeid sisse panna, tuleb lihtsalt
kaks tsüklit juurde panna. Pealkirjad ja lahtrite sisud tuleb eraldi tsüklitesse
paigutada lihtsalt HTMLi loogka tõttu, kus tuleb vasakult paremale oma andmeid
väljastada. Ehkki vajaduse ja tahtmise korral oleks võimalik ehk ka
pealkirjaplokk ja andmete läbikäigu plokk ühendada ning lihtsalt if-iga
kontrollida, kas ollakse andmetega esimese rea juures. Kui jah, siis oleks paras
aeg lisaks muule ka pealkirjalahtrid kirjutada. Siin näites aga pealkirjaosa ja
andmete osa eraldi kirjutatud. Andmete tsüklis siis kõigepealt
käib läbi kõik elemendid "inimene". Sealt seest
võtab kõik, mis ühe inimese seest võtta on. Ning viimaks
annab selle elemendi väärtuse, kus sees parajasti oma läbikäiguga ollakse.
Tulemuseks on viisakas HTML-i tabel.
inimesed
eesnimi |
perenimi |
synd |
Juku |
Juurikas |
1963 |
Juku |
Kaalikas |
1961 |
Kalle |
Kaalikas |
1975 |
Mari |
Maasikas |
1981 |
Oskar |
Ohakas |
1971 |
Ülesandeid
* Tee näited läbi. Lisa inimesele tunnuseks mass. Veendu, et andmed
väljastatakse ka siis tabelina.
* Muuda näidet nõnda, et tabeli asemel genereeritaks loetelu, kus on näha iga
elemendi vaid kaks esimest väärtust.
Näiteks esimese puhul Juku Juurikas
* Muuda näidet nõnda, et tabeli asemel genereeritaks komadega eraldatud loetelu.
Nt
- Juku,Juurikas,1963
* Muuda näidet nõnda, et tabeli asemel genereeritaks laused, mille abil
vastavaid andmeid SQL-baasi sisestada. Inimeste puhul näeks siis lause välja:
INSERT INTO inimesed (eesnimi, perenimi, synd) VALUES ('Juku', 'Juurikas',
'1963');
* Koosta/leia XML-andmefail, kus on kirjas autode registrinumbrid ning omaniku
perekonnanimed
* Veendu, et eelnevalt koostatud XSL-lehed töötavad ka uue andmefailiga.
Parameetrid
Kui samade algandmete põhjal tahetakse kokku panna märgatavalt erinevaid
tulemusi, siis tuleb üldjuhul igaks muundamiseks valmis kirjutada omaette XSL-
leht. Näiteks HTML- ja WAP-väljund näevad nõnda erinevad välja, et ühist
muundajat kirjutada oleks raske. Kui aga valida lihtsalt eri resolutsioonidele
arvestatud HTML-i vahel, siis võib XSLi parameetri abil kord rohkem, kord vähem
lähteandmeid sisse võtta. Samuti, kui näiteks soovitakse näidata lehel inimeste
vanuseid, salvestatud on aga sünniaastad, siis parameetrina antud praeguse
aastaarvu järgi saab vähemalt ligikaudugi tulemuse parajaks sättida.
Parameetri väärtus tuleb määrata eraldi elemendina enne mallikirjelduste
algust. Nagu näha, tuleb parameetri nimi atribuudina, väärtus aga elemendi
väärtusena.
5
Hiljem atribuudi väärtust küsides tuleb avaldises selle nimele dollarimärk
ette panna. Ilma dollarita tähendaks see vastavanimelist XML-elementi.
Andmete sortimiseks tuleb tsükli sisse paigutada alamelement nimega
xsl:sort ning parameetrina määrata, millise elemendi väärtuse järgi
sorteeritakse. Nagu mujal, nii ka siin oleks võimalik parameetriks koostada
avaldis, mis järjestamise peenemalt ette määraks.
Soovides väljatrüki abil tühikuga eraldatud ees- ja perekonnanime, aitab
funktsioon concat. Muul juhul tuleks sama tulemuse saavutamiseks xsl:value-of
element mitmel korral välja kutsuda.
;
Ning näide tervikuna.
ar
5
Nimed, mis sisaldavad kombinatsiooni :
;
Nimed pikkusega ja rohkem:
;
Käivitus
E:\kasutaja\jaagup\xml>java XSLMuundur inimesed.xml inimesed4a.xsl
inimesed4a.txt
ja tulemus
E:\kasutaja\jaagup\xml>more inimesed4a.txt
Nimed, mis sisaldavad kombinatsiooni ar:
Oskar Ohakas;
Mari Maasikas;
Nimed pikkusega 5 ja rohkem:
Kalle Kaalikas varuks 0;
Oskar Ohakas varuks 0;
Parameetrite väärtuste muutmiseks ei pea alati tekstiredaktoriga muutma
XSLi faili sisu. Neid saab sättida ka otse XMLi ja XSLi kokkusiduvas koodis ning
ka ühendava programmi väljakutsel. Nõnda on ka siin näha, kus pikkusele antakse
väärtuseks neli.
tolkija.setParameter("pikkus", "4");
Muus osas näeb faile ühendav käivitusprogramm eelnenuga sarnane välja.
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import java.io.*;
public class XSLParameetrid{
public static void main(String argumendid[]) throws Exception{
Transformer tolkija=TransformerFactory.newInstance().
newTransformer(new StreamSource("inimesed4a.xsl"));
tolkija.setParameter("pikkus", "4");
tolkija.transform(
new StreamSource("inimesed.xml"),
new StreamResult(new FileOutputStream("inimesed4a.txt"))
);
}
}
Ka käivitamine sarnane
E:\kasutaja\jaagup\xml>java XSLParameetrid
Ning tulemusena näeb siis nelja tähe pikkusi ja pikemaid nimesid.
E:\kasutaja\jaagup\xml>more inimesed4a.txt
Nimed, mis sisaldavad kombinatsiooni ar:
Oskar Ohakas;
Mari Maasikas;
Nimed pikkusega 4 ja rohkem:
Juku Juurikas varuks 0;
Juku Kaalikas varuks 0;
Kalle Kaalikas varuks 1;
Mari Maasikas varuks 0;
Oskar Ohakas varuks 1;
ASP.NET vahenditega sama XSL-lehte käivitades on põhjust veebilehele luua kohad
parameetrite väärtuste sisestamiseks. Siinses näites kasutatakse selle tarbeks
tekstivälju. Pöörates tähelepanu lehekülje päisele näeb, et sedakorda on põhjust
eraldi koodifaili loomiseks, millest siis veebileht päritakse.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="parameetrid.aspx.cs"
Inherits="parameetrid" %>
Parameetritega leht
Eraldi koodifailis, lehe laadimisel käivituvas meetodis nimega Page_Load on
kirjas, et millised parameetrite väärtused tuleb XSL-failile edasi anda.
Eelnevast XSL-failis on näha, et selle algusosas on defineeritud kaks
parameetrit. Parameeter nimega otsing vaikeväärtusega "ar" ning parameeter
pikkus väärtusega 5. Siinses näites kirjutatakse otsinguparameeter alati üle
tekstiväljast tuleva väärtusega. Pikkus asendatakse aga vaid juhul, kui selle
jaoks mõeldud tekstiväljas nimega kast2 oli väärtus, mida on võimalik arvuks
teisendada. XsltArgumentList-tüüpi muutujasse kogutakse parameetrid ja nende
väärtused kokku ning siis pannakse vastav parameetrite loetelu transformatsiooni
eest hoolitseva elemendi külge.
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Xml.Xsl;
public partial class parameetrid : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XsltArgumentList p = new XsltArgumentList();
p.AddParam("otsing", "", kast1.Text);
int abi;
if(int.TryParse(kast2.Text, out abi)){
p.AddParam("pikkus", "", kast2.Text);
}
xml1.TransformArgumentList = p;
}
}
Nulemusena võib siis näha sisestatud andmetele vastavat tulemust veebilehel.
Element pre aitas tekstina tulnud andmed viisakalt eraldi ridadele joondada.
Nimed, mis sisaldavad kombinatsiooni M:
Mari Maasikas;
Nimed pikkusega 2 ja rohkem:
Juku Juurikas varuks 2;
Juku Kaalikas varuks 2;
Kalle Kaalikas varuks 3;
Mari Maasikas varuks 2;
Oskar Ohakas varuks 3;
Otsitav tekst:M
Miinimumpikkus:2
Ülesandeid
* Koosta tervitav XSL-leht, mille pealkiri antakse ette parameetriga
* Anna parameetrina ette praeguse aasta number. Väljasta iga inimese vanus selle
aasta lõpuks.
* Lase kasutajal tekstiväljast anda ette vähim ja suurim sünniaasta, mille vahel
olevate inimeste andmeid näidatakse.
Mallid, alamprogrammid
Enamikes enesest lugu pidavates programmeerimiskeeltes on eraldiseisvate ning
korduvalt ettevõetavate toimingute tarbeks olemas alamprogrammid või midagi
sarnast. XSLis on selleks tarbeks mallid. Kirjeldatakse ära, kuidas mingeid
andmeid väljundis näidata ning hiljem saab selle malli sobivas kohas välja
kutsuda. Järgnevas näiteks on omaette malliks tehtud saatja aadress. Et kui seda
vaja kuhugi kirjale lisada, siis piisab vaid vastavast väljakutsest.
Defineerimise kohal siis
ning väljakutsel
Kogu kood tervikuna:
Tallinna Ülikooli Informaatika Instituut, Narva maantee 25-419, 10120,
Tallinn
Lugupeetud vilistlane, kutsume teid taas vana kooli vaatama!
Ja nagu koodi lugedes aimata võib, tulemuseks on teade koos sinna lõppu lisatud
saatja aadressiga.
Lugupeetud vilistlane, kutsume teid taas vana kooli vaatama!
Tallinna Ülikooli Informaatika Instituut, Narva maantee 25-419, 10120, Tallinn
Et malli töö tulemust vastavalt andmetele muuta saaks, selleks tuleb ette anda
parameetrid. Malli enese algusesse tuleb kirjutada, et millise nimega parameeter
on.
Koodis parameetri väärtuse kasutamiseks tuleb sinna dollarimärk ette panna.
Tere,
Väljakutsel saab temale ette anda tavalise väärtuse. Et Siim on etteantud
tekstikonstant, teda ei võeta XML-faili seest, selleks on nimele ülakomad ümber
pandud.
XSLi kood tervikuna
Tere,
Ning tekkinud väljund:
Tere, Siim
Kui nimi võetakse XMList, siis tuleb määrata asukoht, kust see leida. Praegusel
juhul antakse alamprogrammile parameetrina kaasa esimese inimese eesnimi.
Käivitamisel tervitatakse teda rõõmsasti.
Tere, Juku
Malli parameetriks ei pruugi olla üksiks väärtus. Selleks võib olla ka etteantud
kohast algav andmepuu (nt. terve inimene kõikide tema juurde kuuluvate
andmetega) või siis andmekogum (massiiv). Järgnevas näites pruugitaksegi viimast
varianti. Loetelu saamiseks käiakse xsl:for-each tsükliga läbi kõik etteantud
andmestiku elemendid. Ning malli väljakutsel olev inimesed/inimene/eesnimi
annabki kõikide vastavas XML-failis olevate inimeste eesnimed parameetrina
kaasa.
Inimeste eesnimede loetelu
Tulemuseks on viisakas loetelu.
Inimeste eesnimede loetelu
- Juku
- Juku
- Kalle
- Mari
- Oskar
Ülesandeid
* Koosta mall, mis väljastaks tärnidest rea. Katseta.
* Koosta mall, mis trükiks etteantud teksti välja punaselt.
* Võrreldes eelmisega saab ka värvi anda ette malli väljakutsel
* Koosta mall, mis trükib etteantud elemendist loeteluna välja kõikide
alamelementide nimed ja nende väärtused.
* Koosta mall, mis saab etta sarnase struktuuriga elementide (näiteks inimeste)
massiivi ning väljastab nende alamelementide tulemused tabelina. Katseta
mitmesuguste sisendandmete korral.