
Informationsansvarig: Marie-Louise Gustafsson, webmaster@itn.liu.se
Sidan uppdaterades senast: 2006-05-16
LiU > ITNUtbildning
Utbildningsområden
Rekursion, named templates, parametrar, variabler, xpath-funktioner
Denna laboration består av två delar. Den första är en fördjupning på liknande tema som i XSLT-laborationen, medan den andra är mer datateknisk än övriga, och introducerar ett antal mer avancerade delar av xslt. Om du gör alla delarna i laborationen kommer du kunna hantera det som i XSLT närmast motsvarar funktionsanrop, förstå rekursionsbegreppet och ha en djupare insikt i de funktioner som finns inbyggda i xpath. Du kommer göra ett antal templates som hanterar olika matematiska funktioner
Läs http://www.w3.org/TR/xpath, i synnerhet exemplen på location paths i kapitel 2, "abbreviated syntax" i kapitel 2.5, samt kapitel 3.4, 3.5 och hela kapitel 4. En referenslista som är något mer lättläst, men inte lika komplett finns också på http://www.w3schools.com/xpath/xpath_functions.asp.
Ladda sedan ner filerna math.xml och math.xsl , och lägg dessa i en katalog du kallar "lab-avanceradxslt" i din kurskatalog på webbservern. Det är filen math.xsl du sedan ska redigera.
Hela laborationen är frivillig och kan ge mellan 0 och 8poäng. Inga bonuspoäng ges för att lämna in laborationern senast ett visst datum.
Denna uppgift går ut på att använda xsl:number, generate-id() samt for-each-loopar för att göra interna länkar i ett dokument, samt en innehållsförteckning. Filerna du ska jobba med är report.xml (källfilen), report-html.xsl (stylesheetfilen) report-html.html (filen vilken ni ska försöka efterlikna). När du är klar ska alltså tranformationen av report.xml med hjälp av report-html.xsl (dvs när du skickar en request till urlen som slutar med report.html) ge samma resultat som filen report-html.html.
Du kan antingen göra transformationerna direkt i webbläsaren, eller med ett program såsom TestXSLT (se XSLT-laborationen)
Tips hur man kan undvika det avslutande kommatecknet i listor:
<xsl:if test="not(position()=last())"> ...
Börja med att öppna filen math.xml i Mozilla/Firefox eller Internet Explorer för Windows. Du bör se ett innehåll som ser ut så här:

Din första uppgift blir nu att skriva en template i filen math.xsl som matchar på elementet "times". Templaten ska använda två variabler, "times1" och "times2". Times1 ska antaga värdet av det evaluerade första barnelementet till elementet "times" (vilket betyder att du måste göra en "apply-templates"), och times2 ska antaga värdet av det andra barnelementet. Slutligen ska värdet av times1*times2 returneras.
Om allt fungerar som det ska kommer siffrorna "5 8" under rubriken "Multiplikation" nu istället vara "40".
Du ska nu göra en template som kan räkna ut fakultet av ett tal. Fakultet av ett tal är som bekant produkten av samtliga positiva heltal mindre än eller lika med talet i fråga. 5! är t.ex. 1*2*3*4*5=120. Man kan också säga att n! = n*(n-1)!, alltså i exemplet 5*4!. Om man vet detta, samt vet att 1!=1 kan man göra en så kallad rekursiv lösning av problemet. En rekursiv funktion är en funktion som anropar sig själv.
I detta fall ser algoritmen ut så här skrivet med någon typ av meta-kod
fact(n) {
if(n==1)
return 1
else
return n*(fact(n-1))
}
För att implementera denna typ av algoritm i XSLT gör du lämpligen så här:
Gör en template som matchar på element med nament "fact". Denna template ska sedan anropa ("xsl:call-template") en namngiven template (name="factorial"), och bifoga en parameter ("n") vars värde initialt är värdet av elementet "fact". För att skicka med parametrar använder du "xsl:with-param".
Templaten med attributet name="factorial" (OBS! Inte match="factorial") använder parametern n, kollar om n=1 och returnerar i så fall 1. Om n>1 returneras istället n*(n-1)!, vilket alltså kräver ett nytt anrop till den namngivna templaten "factorial", denna gång med parametern n satt till n-1. Observera att du förmodligen kan behöva mellanlagra (n-1)! i en variabel (xsl:variable).
Tips: Jag använde följande xslt-element (skrivna i slumpmässig ordning):
När du är färdig kommer talet under rubriken "Multiplikation" nu vara 960.
Denna uppgift innehåller inga större skillnader mot föregående uppgift, men du får ingen ledning. Det enda du får veta är hur fibonaccital fungerar.
Fibonnactital är uppbyggda så att fib(n) = fib(n-1)+fib(n-2). Startvärdena är fib(0)=0 och fib(1)=1.
Din uppgift är nu att göra lämpliga templates så att ett element <fib>n</fib> returnerar fibonaccivärdet av n. När du är klar kommer talet under rubriken "Multiplikation" nu vara 2520.
Nästa uppgift är att göra lämpliga templates så att textnodinnehållet i ett element med namnet "reverse" skrivs ut baklänges.
Tips: Använd xpath-funktionerna string-length() och substring().
När du är klar kommer math.xml nu se ut så här i din webbläsare.

Avslutningsvis ska du göra en xslt-implementation av Euclides algoritm. Euclides algoritm används till att räkna ut minsta gemensamma nämnaren för två tal. Algoritmen kan beskrivas så här (hämtat från http://www.latronix.se/ramar/ram_manneneuclides_sve.htm där även mer bakgrundsinformation om Euclides finns)
Minsta gemensamma nämnaren till två tal, t ex 693 och 147 kan bestämmas på följande sätt:
Tips: xpath-uttrycket "x mod y" returnerar resten vid heltalsdivision av x och y.
När du är klar bör talen "693 147" under rubriken "Euclides algoritm" vara ersatta med talet "21".
När du är klar med de uppgifter du tänkt dig behandla lämnar du länkar till där dina filer ligger i It's learning samt anger även i kommentarfältet vilka av uppgift 1-6 du behandlat.