Introduktion till XSLT Föreläsning 3 i kursen: Innehållsdesign av digitala a resurser se Monica Langerth Zetterman monica.zetterman@edu.uu.se Uppsala universitet Vad är XSLT? Extensible Style Language (XSL) är en språkfamilj Består av tre delar: 1. extensible Stylesheet Language for Transformations (XSLT) för att transformera xml-dokument 2. XPath språk som används av XSLT för åtkomst eller för att referera till delar av XML dokument. 3. XSL FO XML ett XML vokabulär för att specificera formattering (XSL Formatting Objects) Se http://www.w3.org/style/xsl/ för W3C:s specifikationer av XSL-familjen. Introduktion till XSL 2 1
Varför transformera? Konvertera ett schema till ett annat jag säger p, du säger para Arrangera om data för t ex formatering T ex välja var noterna skall placeras Välja eller projicera delar av dokument visa de stycken som handlar om Kant Bearbeta data i en ny miljö t ex i en xml-databasmiljö, eller i en relationsdatabas Introduktion till XSL 3 En input flera output html pdf xml xml txt databas excel Introduktion till XSL 4 2
XSL (extensible Stylesheet Language) - en familj med flera medlemmar XPath en teknik för att referera till specifika noder i ett dokumentträd XSLT (XSL Transformations) en teknik för att omvandla ett dokumentträd. XSLT har drygt 30 fördefinierade element ( i ver 1.0) XSL-FO (XSL Formatting Objects) en teknik för att precisera hur noder skall presenteras i olika medier (jfr. CSS) Xquery egentligen "XML Query men ingen säger det) som SQL fast för att göra utsökningar i XML-dokument (behandlas inte i den här kursen) XSLT - Transformeringens delar Ett källdokument, dvs xml-fil Ett resultatträd i form av xml html txt Själva transformeringen görs genom olika metoder: DOM (Document Object Model) se http://www.w3.org/dom/ SAX ( Simple API for XML) se http://sax.sourceforge.net/ Introduktion till XSL 6 3
Träd & Noder Med XSLT tänker man inte i termer av dokument Ett träd representeras av data i dokumentet som noder Noder är element, attribut, kommentarer mm i en hierarki Introduktion till XSL 7 Typ av noder Rot: starten av dokumentet OBS! inte samma som rotelementet i en xml-fil Attributnoder Kommentarnoder Namnrymder PI:s ( t ex xml deklarationen) textnoder Introduktion till XSL 8 4
Navigering Relationer Rot Barn Löv Syskon, förfäder, avkomlingar Introduktion till XSL 9 XPath grundläggande syntax. aktuell nod // var som helst i dokumentet / Roten.. Föräldranoden @ attribut [1] position /steg/steg/steg = absolut referens steg/steg/steg = relativ referens Se http://www.w3.org/tr/xpath#section-location-steps Se: http://www.w3schools.com/xpath/xpath_syntax.asp Introduktion till XSL 10 5
Stilmallar Stilmallar byggs upp av templates Templates innehåller XSL element & XPath uttryck suffix =.xsl måldokumentet måste vara välformad XML XSLT har en uppsättning fördefinierade element (funktioner) som utför vissa bestämda transformationer Se: http://www.w3schools.com/xsl/xsl_w3celementref.asp Introduktion till XSL 11 Exempel på lokaliseringssteg child::para[@type= svag"][3] nod typ nod test attribut referens text positions sträng test Skilj på versal/gemeni esa/ge e XSL Hittar det tredje barnet av aktuell nod som: (a) är ett element av typen 'para' och (b) har ett 'type' attribut vars värde är ' svag' 12 6
Formell syntax - exempel ancestor::person ancestor-or-self::person attribute::age child::surname descendant::person descendant-or-self::persname following::person following-sibling::person parent::persname preceding::person preceding-sibling::person self::person <person sex= w" age= 78"> <persname> <forename>anna</forename> <surname>andersson</surname> </persname> <birth date="1890-04-05"/> <death date="1968-04-14"/> <nationality code= Swe"/> </person> Introduktion till XSL 13 Förkenklad XSLT syntax person = child::person @ = attribute:: @age = attribute::age. = self::node()./birth = self::node()/birth.. är = parent::node()../birth = parent::node()/child::birth // = descendant-or-self::node() person//surname = child::person/descendant-orself::node()/child::surname person[@age=74] = child::person[attribute::age=74] Introduktion till XSL 14 7
X-path exempel 1 <person sex= w" age= 78"> <persname> <forename>anna</forename> <surname>andersson</surname> </persname> <birth date="1890-04-05"/> <death date="1968-04-14"/> <nationality code= Swe"/> </person> Var pekar följande sökväg : /person/persname/surname? /person/@sex? /person/birth/@date? förkortningen //surname? /person//surname? Om ett Xpath-uttryck startar med / - då är det en absolut pekare/stig till ett element. Om ett Xpath-uttryck startar med // - då kommer alla element i dokumentet som uppfyller kriterierna att väljas. Introduktion till XSL 15 X-path exempel 2 <person sex= w" age= 78"> <persname> <forename>anna</forename> <surname>andersson</surname> </persname> <birth date="1890-04-05"/> <death date="1968-04-14"/> <nationality code= Swe"/> </person> Var pekar följande sökväg: /person/*/surname? //persname/*? /person/*? //*? /person/persname[1] //person[@age > 70]? Man kan använda flera sökvägar i samma uttryck, t ex: //person OR //surname OR //birth eller also /person/persname //birth Introduktion till XSL 16 8
Åtkomst av XML-strukturen Rotelement X X1 X2 X1 X3 Y XPath i kombination med XSLT gör det möjligt att precisera vad i xmlträdet som skall bearbetas, dvs vilka noder som det skall hända något med. 1) x1, x2, x3 är barn (child) till X 2) X är förälder (parent) ) till x1, x2, x3 3) x1, x2, x3 är syskon (sibling) 4) x1 är äldre syskon (precedingsibling) till x2 5) Rotelementet är förfader (ancestor) till x1, x2, x3 6) x1, x2, x3 är ättlingar (desendant) till Rotelementet och till X Som regel vill man att ett visst XPath-uttryck tillsammans med ett xslt-element antingen 1) grabba tag i en uppsättning noder, och/eller 2) generera innehåll utifrån källdokumentet. Dokumentträd bibliography bibl bibl bibl bibl title author title author title author title author m w m w lastname firstname lastname firstname lastname firstname lastname firstname Kay Micael Hocke y Susan Aarset h Espen Ide Nancy bibl, title, author = elementnoder m & w = attributnoder (<author type= m >, OBS! attributnoder ingår inte i själva dokument hierarkin utan betecknar egenskaper som ett visst element besitter Författarnamnen = textnoder Exempel från bibl.xml som används i xmlövning 1 9
Traversering XSL förutsätter en xml-processor eller tolk (MSXML, XALAN, Saxon etc) ett program som kan traversera xmlträdet och göra något med de noder det stöter på, exempelvis omvandla ett tei-element element till ett html-element. Dessa tolkar finns inbyggda i Oxygen och där kopplar man ihop xml-dokumentet med en stilmall i t ex XSLT för att transformera texten (se särskild handledning i Studentportalen för att koppla en stilmall till ditt xml dokument) Givetvis måste detta ske i en speciell ordningsföljd: xmlprocessorn gör en på-djupet-först (depth-first) sökning med t ex DOM (Document Object Model) En XML DOM används för att komma åt och uppdatera innehållet, formatet och strukturen i XML-dokument via ett gränssnitt. Gränssnittet har formen av en objektmodell som består av objekt, egenskaper, metoder och händelser som kan representera och ändra komponenterna i ett XML-dokument. En DOM lagrar data för ett XML-dokument i en hierarkisk trädstruktur som efterliknar strukturen i dokumentet 2 Traversering av dokumentträd 1 bibliography bibl bibl bibl bibl title author title author title author title author m w m w 3 4 5 lastname firstname lastname firstname lastname firstname lastname firstname 6 Kay Micael Hockey Susan Aarseth Espen Ide Nancy 7 Vid traversering av dokumentträdet läser ett gränssnitt in innehållet i en DOM (Document Object Model) Med en DOM kan man komma åt alla komponenter i ett XML-dokument, inklusive dokumentets element, attribut, textnoder, bearbetningsinstruktioner, kommentarer och enhetsdeklarationer (t ex ä [ä]). Alla XML-dokument kan läsas in i en DOM. När ett XML-dokument läses in i en DOM läses det från början till slut och lagras i DOM:en som en logisk modell av noder. Läs mer vid: http://www.w3schools.com/dom/default.asp 10
Operatorer + Addition 3 + 2 = 5 Subtraktion 10 2 = 8 * Multiplikation 6 *4 = 24 div Division 8 div 4 = 2 Lika med @age = 74!= inte lika med @age!= 74 < mindre än @age < 84 <= mindre än eller lika med @age <= 72 > större än @age > 25 >= större än eller lika med @age >= 72 OBS! OR = (Alt Gr + tangenten med < > och ) Nodfunktioner count() Returnerar antal noder i ett urval noder count(person) id() Väljer elements genom unikt ID id('s3') last() -- Returner nummer på positionen av den sista noden person[last()] name() Returnerar namnet på en nod //*[name('person')] position() -- Returnerar position på den nod i den nodlista som för tillfället processas //person[position()='6'] 11
Strängfunktioner concat() -- Concatenaternerar sina argument concat('http://', $domain, '/', $file, '.html') contains() returnerar sant om andra argumentet finns i det första //persname[contains(surname, 'van')] normalize-space() tar bort alla onödiga mellanslag och ersätter med endast ett mellanslag normalizespace(surname) starts-with() -- returnerar sant om andra argumentet startar i det första starts-with(surname, 'van') string() Konverterar ett argument till en sträng string(@age) Numeriska funktioner ceiling() Returnerar den minsta integer som inte är mindre än det givna argumentet ceiling(3.1415) floor() -- Returnerar den största integer som inte är större än det givna argumentet floor(3.1415) number() Konverterar argumentet till ett numeriskt värde number('100') round() Avrundning till närmaste integer round(3.1415) sum() returnerar summan av givna argument sum(//person/@age) not() Returernar sant om argumentet är falskt not(position() >5) 12
Vanliga element Observera att man alltid skriver xsl:[namn på elementet], t ex <xsl:template match="div"> apply-templates applicerar en regel på aktuellt element eller på elementets barn. for-each söker igenom varje nod i ett specificerat nodset ( en loop) if en regel/stilmall som utförs endast om kriterierna är uppfyllda key deklararar en nyckel (en slags variabel) som kan användas ihop med key() funktionen, se http://www.w3schools.com/xsl/el_key.asp sort sorterar output, default är stigande (dvs a till ö, 0-9) om ingen parameter anges Vanliga element forts. stylesheet definierar rotelementet. OBS startar alltid en stilmall text skriver ut text i output, tex om man vill lägga till ett komma och mellanslag mellan ord som kommer att skrivas ut <xsl:text>, </xsl:text> template regel som ska tillämpas när en viss nod blir matchad t ex <xsl:template match="/"> Läs mer vid: http://www.w3schools.com/xsl/xsl_w3celementref. asp där finns alla vanliga element listade,klicka på dem, läs exemplen och testa i din egen browser 13
Hur? En xml-fil <recipe> <title>pasta för nybörjare</title> <ingredients> <item>pasta</item> <item>riven ost</item> </ingredients> <cook>koka pastan and blanda med osten</cook> </recipe> Output i html <html><body> <h1>pasta för nybörjare</h1> <p>ingredienser: Pasta, riven ost</p> < p>koka pastan and blanda med osten </p> </body></html> Exemplen finns på Studentportalen (pasta.xml & pasta.xsl) Stilmall Stilmallen greppar tag i elementen och sedan skriver ut deras innehåll (texten) <xsl:stylesheet version="1 1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="recipe"> <html><body> <h1><xsl:value-of select="title"/></h1> <p>ingredients: <xsl:apply-templates select = "ingredients/item"/> </p> <p><xsl:value-of select="cook"/></p> </body></html> / </xsl:template> </xsl:stylesheet> Testa output och ändra i stilmallen! Exemplen finns på Studentportalen (pasta.xml & pasta.xsl) Där finns även flera andra stilmallar som du kan använda som exempel och för att testning 14
Tre metoder för att tillämpa XSL 1. on-the-fly xsl-mallen appliceras på xml-dokument i samma stund som en webbläsare läser in xml-dokumentet. (fungerar bäst i Internet Explorer som har inbyggd processor MSXML 3.0 el 4.0) 2. batch xsl-mallen associeras med och appliceras på ett xmldokument via en fristående xsl-processor (t ex Xalan m fl i Oxygen). 3. En server hämtar xml-fil och xsl-fil och genererar utdata till en webbläsare (t ex Cocoon) Ni kommer att använda metod 1 och 2. Hur man associerar ett xslt-skript (stilmall) till ett xml-dokument i Oxygen visas här: http://www.oxygenxml.com/xslt_editor.html Hur man associerar en xslt till xml-dokumentet t visas på nästa bild XSL-FO inner jag inte gå igenom. Läs och öva själva vid: http://www.w3schools.com/xslfo/default.asp Associera stillmallen on-the-fly I en html-fil associerar man en stillmall ( till exempel en cssmall) i <head> så här: <link rel="stylesheet" type="text/css" ref= minmall.css"> I en xml-fil placerar man referensen till xsl-mallen direkt efter xml-deklarationen: <?xml version="1.0" encoding="iso-8859-1"?> <?xml:stylesheet type="text/xsl" href= minmall.xsl"?> OBS! Tänk på att om du inte har mallen i samma katalog som xml-filen/html-filen måste du även ange sökväg till den katalog (mapp) där stilmallen/mallarna finns. T ex: href=./mallar/minmall.xsl" 15
Inlämningsuppgift 3 Utgå från din bild det vill säga den bild du xml-märkt Gör en stilmall (XSLT) som visar: brödtext rubriker en lista över gamla ord (efter brödtexten) överkurs: en lista med de gamla orden och deras moderna stavning Resultatdokument: Texten ska visas i en browser. Transformera i själva webbläsaren eller Oxygen. Om Oxygen används för transformering spar måldokumentet t som html (bifogas när du lämnar in) Exempel på stilmallar finns på Studentportalen i mappen Kursmaterial Stilmallar Introduktion till XSL 31 Resurser Exempel & övningar http://www.w3schools.com/xsl/ w3schools com/xsl/ Stilmallar för TEI-märkta texter: http://www.tei-c.org/tools/stylesheets/ Intro & exempel: http://www.jenitennison.com/xslt/ Youtube: exempel & lektioner http://www.youtube.com/watch?v=prnjj Ch7Ppg&feature=related Introduktion till XSL 32 16