Informationsansvarig: Marie-Louise Gustafsson, webmaster@itn.liu.se
Sidan uppdaterades senast: 2006-05-16
LiU > ITN>Utbildning> Utbildningsområden


[ Hoppa direkt till textinnehållet ] [ Hjälp ] [ Tillgänglighetsinformation ]
In English | A till ÖKartorKontakta oss
Gå till LiU.se
LiU > ITN>Utbildning> Utbildningsområden

Laboration Avancerade XSLT-transformationer (ej testkörd 2007)
Laborationspoäng: 0-8

Nyckelord

Rekursion, named templates, parametrar, variabler, xpath-funktioner

Översikt

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

Förberedelser

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.

Poäng

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.

Uppgift 1: Loopar och numreringar(3 p)

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())"> ...

Uppgift 2: Variabler och multiplikation (1 p)

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:

Utseende innan laborationen påbörjats

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".

Uppgift 3: Rekursivitet, parametrar och namngivna templates applicerat på fakultet(1p)

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):

  • xsl:value-of
  • xsl:choose
  • xsl:template
  • xsl:variable
  • xsl:when
  • xsl:call-template
  • xsl:with-param
  • xsl:param

När du är färdig kommer talet under rubriken "Multiplikation" nu vara 960.

Uppgift 4: Fibonaccital (1p)

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.

Uppgift 5: Att vända en sträng (1p)

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.

Uppgift 6: Euclides algoritm (1p)

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:

  1. Man dividerar det största talet med det minsta:
    693 / 147 = 4 med 105 i rest.
  2. Det minsta talet divideras med den första resten:
    147 / 105 = 1 med 42 i rest.
  3. Första resten divideras med andra resten:
    105 / 42 = 2 med 21 i rest.
  4. Andra resten divideras med tredje resten:
    42 / 21 = 2 (alltså utan rest!)
  5. Den sista rest man får är minsta gemensamma nämnaren till talen.
    21 alltså minsta gemensamma nämnaren till 693 och 147.

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".

Redovisning

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.