Title: XSLT
1XSLT en introduktion
- Digitalisering av kulturarvet
2Idag
- Vad är XSLT?
- Hur fungerar XSLT?
- XPath och noder
- XSLTs notation
- Templates, repetitioner och villkor
- TEI
3XSL-språk
- XSLT
- Ett språk för att transformera XML-dokument
- X-PATH
- Ett språk för att navigera i XML-dokument
- XSL-FO
- Ett språk för att formatera XML-dokument
4Vad är XSLT?
- Står för eXstensible Stylesheet Language for
Transformation - Ett programmeringsspråk för att transformera
XML-dokument - En W3C-standard
- XSLT transforms an XML source-tree into an XML
result-tree
5Den röda tråden
- DATA LOGIK GRÄNSSNITT
- XML XSLT XHTML(CSS)
6XML, XSLT, XHTML och CSS
XML
XSLT
CSS
Omvandling
XHTML
7Hur fungerar XSLT?
- lt?xml version"1.0" encoding"iso-8859-1"?gt
- lt!DOCTYPE boksamling SYSTEM "boksamling.dtd"gt
- lt?xml-stylesheet type"text/xsl"
href"boksamling.xsl"?gt - ltboksamlinggt
- ltbok/gt
- lt/boksamlinggt
8En post i XML-filen
- ltbokgt
- ltforfattaregt
- ltfNamngtSuelt/fNamngt
- lteNamngtGraftonlt/eNamngt
- lt/forfattaregt
- lttitelgtL som i laglöslt/titelgt
- ltkategorigtDeckarelt/kategorigt
- ltpris valuta"gbp"gt20lt/prisgt
- lt/bokgt
9XSLT-kod
- lt?xml version"1.0" encoding"ISO-8859-1" ?gt
- ltxslstylesheet version"1.0" xmlnsxsl"http//ww
w.w3.org/1999/XSL/Transform" - xmlns"http//www.w3.org/1999/xhtml"gt
- ltxsloutput method"html" indent"yes"/gt
- ltxsltemplate match"/"gt
- ltxslapply-templates select"boksamling"/gt
- lt/xsltemplategt
- ltxsltemplate match"boksamling"gt
- ltxslapply-templates select"bok"/gt
- lt/xsltemplategt
- ltxsltemplate match"bok"gt
- Författare ltxslvalue-of select"forfattare/fNam
n"/gt - ltxsltextgt lt/xsltextgt
- ltxslvalue-of select"forfattare/eNamn"/gtltbr /gt
- Titel ltxslvalue-of select"titel"/gtltbr /gt
- Kategori ltxslvalue-of select"kategori"/gtlthr
/gt - lt/xsltemplategt
- lt/xslstylesheetgt
10XPath
- Ett språk för att navigera i XML-dokument
- En syntax för att definiera delar av ett
XML-dokument - En W3C-standard
- XSLT använder XPath för att navigera i
XML-dokument
11XPath - noder
- XML-dokument behandlas som träd bestående av
noder - Typer av noder
- Element
- Attributes
- Text
- Namespaces
- Processing instruction
- Comment lt!-- kommentar --gt
- Document node (dokumentets rotelement)
12XPath - noder
- lt?xml version"1.0" encoding"iso-8859-1"?gt
- ltboksamlinggt
- ltbokgt
- ltforfattaregt
- ltfNamngtSuelt/fNamngt
- lteNamngtGraftonlt/eNamngt
- lt/forfattaregt
- lttitelgtL som i laglöslt/titelgt
- ltkategorigtDeckarelt/kategorigt
- ltpris valuta"gbp"gt20lt/prisgt
- lt/bokgt
- lt/boksamlinggt
Dokumentnod (rotelement)
Elementnod
Textnod
Attributnod
13XPath Relationer mellan noder
- Varje element och attribut har en och endast en
förälder - Elementnoder har noll till många barn
- Noder med samma förälder kallas syskon
- Det första syskonet är äldst, det näst första är
näst äldst och så vidare - En förfader är en förälders förälder
- En ättling är ett barns barn
14XPath Peka ut noder
- Nodnamn Pekar ut samtliga barn till noden
- / - Pekar ut från rotelementet
- // - Pekar ut noder i dokumentet från den
aktuella nod som matchar utpekningen - . Pekar ut aktuell nod
- .. Pekar ut föräldern till aktuell nod
- _at_ - Pekar ut attribut
15XPath Peka ut noder
- boksamling Pekar ut samtliga barn till noden
boksamling - /boksamling Pekar ut rotelementet boksamling
- boksamling/bok Pekar ut alla bok-element som är
barn till boksamling - //bok pekar ut samtliga bok-element, oavsett
var de befinner sig i hierarkin - boksamling//titel Pekar ut samtliga
titel-element som är ättlingar till boksamling,
oavsett var de befinner sig i hierarkin - //_at_currency Pekar ut samtliga attributnoder med
namnet currency
16Exempel template-anrop
- ltxsltemplate match"boksamling"gt
- ltxslapply-templates select"bok/forfattare/eNamn
"/gt - lt/xsltemplategt
- Gör att vi är säkra på att rätt eNamn hämtas, dvs
det som är barn till forfattare som i sin tur är
barn till bok
17En annan variant
- ltxsltemplate match"boksamling"gt
- ltxslapply-templates select"bok//eNamn"/gt
- lt/xsltemplategt
- Gör att vi är säkra på att rätt eNamn hämtas, dvs
det som är ättling till bok
18En tredje variant
- ltxsltemplate match"boksamling"gt
- ltxslapply-templates select"//forfattare/eNamn"/
gt - lt/xsltemplategt
- Gör att vi är säkra på att rätt eNamn hämtas, dvs
det som är barn till forfattare
19En fjärde variant
- ltxsltemplate match"boksamling"gt
- ltxslapply-templates select"//eNamn"/gt
- lt/xsltemplategt
- Fungerar om eNamn finns på endast en nivå i
trädet - Skulle eNamn finnas på flera nivåer förväxlar
tolken noderna med varandra - Att ha samma namn på noder på olika nivå i
XML-trädet är dock ingen optimal lösning
20Exempel anropat template
- ltxsltemplate match"eNamn"gt
- ltxslvalue-of select"."/gt
- ltxslvalue-of select"../fNamn"/gt
- ltxslvalue-of select"../../titel"/gt
- ltxslvalue-of select"../../kategori"/gt
- lt/xsltemplategt
Pekar ut aktuell nod (eNamn)
Pekar ut eNamns förälders (forfattare) barn (fNamn) (enkelt uttryckt eNamns syskon)
Pekar ut eNamns förfäders barn
21Operatorer
- AA (A är ekvivalent med A)
- A!B (A är inte ekvivalent med B)
- AgtB (A är större än B)
- AltC (A är mindre än C)
- AgtD (A är större än eller lika med D)
- AltE (A är mindre än eller lika med E)
- Ett uttryck av detta slaget är antingen sant
(true) eller falskt (false)
22Operatorer
- AA and B!C
- Sant om och endast om A är ekvivalent med A och B
inte är ekvivalent med C - AA or BC
- Sant om A är ekvivalent med A eller om B är
ekvivalent med C - Om första påståendet är sant kollas inte fler
påståenden - not (AB)
- Sant om och endast om A inte är ekvivalent med B
23Aritmetiska operatorer
- addition 52
- - subtraktion 7-2
- multiplikation 83
- div division 6 div 3
- mod modulus 9 mod 2
24XSLT
- Förändra en icke presentabel fil till en webbsida
- Formatera ett dokument till PDF eller liknande
- Förändra en XML-vokabulär till en annan
- Extrahera specifik information från ett dokument
och formatera på ett annat sätt
25XSLTs notation
- Alla element i XSLT innehåller prefixet xsl
- ltxslchoosegt
- lt/xslchoosegt
- ltxslsort select"name"/gt
- ltxslvalue-of select"name"/gt
26Operatorer i XSLT
- AA A är ekvivalent med A
- A!B A är inte ekvivalent med B
- 8 gt 6 8 är större än 6
- 6 lt 8 6 är mindre än 8
- A gt B A är större än eller lika med B
- B lt A B är mindre än eller lika med A
27Operatorer i XSLT
- AND, OR och AND!
- pris lt 10 and kategori 'Deckare
- pris lt 10 or kategori 'Deckare
- pris lt 10 and kategori ! 'Deckare
28Templates
- Innehåller regler som appliceras vid matchning av
en specificerad nod - Syntax
- ltxsltemplate namenamn" matchmönster"
modeform" prioritysiffra"gt -
- lt/xsltemplategt
- Samtliga attribut är valfria, men minst ett av
attributen name och match måste återfinnas
29Exempel, templates
- ltxsltemplate match"boksamling"gt
- ltxslapply-templates select"bok/forfattare/eNamn
"/gt - lt/xsltemplategt
- ltxsltemplate match"eNamn"gt
- ltxslvalue-of select"."/gt
- ltxslvalue-of select"../fNamn"/gt
- ltxslvalue-of select"../../titel"/gt
- ltxslvalue-of select"../../kategori"/gt
- lt/xsltemplategt
30Exempel, templates med villkor
- ltxsltemplate match"boksamling"gt
- ltxslapply-templates select"bok/forfattareeNamn
'Grafton'"/gt - lt/xsltemplategt
- ltxsltemplate match"forfattare"gt
- ltxslvalue-of select"eNamn"/gt
- ltxslvalue-of select"fNamn"/gt
- ltxslvalue-of select"../titel"/gt
- ltxslvalue-of select"../kategori"/gt
- lt/xsltemplategt
31Repetitioner i XSLT for-each
- ltxslfor-each selectX-PATH-uttryckgt
- kod som utförs på varje nod som överensstämmer
med X-PATH-uttrycket - lt/xslfor-eachgt
32Exempel for-each
- ltxsltemplate match"/"gt
- ltxslfor-each select"boksamling/bok"gt
- ltxslvalue-of select"forfattare/eNamn"/gt
- ltxslvalue-of select"forfattare/fNamn"/gt
ltxslvalue-of select"titel"/gt - ltxslvalue-of select"kategori"/gt
- lt/xslfor-eachgt
- lt/xsltemplategt
33Exempel for-each med villkor
- ltxsltemplate match"/"gt
- ltxslfor-each select "boksamling/bok/forfattare
eNamn 'Grafton'"gt - ltxslvalue-of select"eNamn"/gt
- ltxslvalue-of select"fNamn"/gt
- ltxslvalue-of select"../titel"/gt
- ltxslvalue-of select"../kategori"/gt lt/xslfor-e
achgt - lt/xsltemplategt
34Styrstrukturer i XSLT
- om (villkor a) utför a
- annars om (villkor b) utför b
- annars utför c
35Med if
- ltxslif testvillkor a"gt
- kod som utförs om villkor a är sant
- lt/xslifgt
- ltxslif testvillkor b"gt
- kod som utförs om villkor b är sant
- lt/xslifgt
- ltxslif testvillkor c"gt
- kod som utförs om villkor c är sant
- lt/xslifgt
36Exempel if
- ltxslif test"pris lt 10 and kategori !
'Deckare'"gt - ltxslvalue-of select"forfattare/eNamn"/gt32
- ltxslvalue-of select"titel"/gt
- lt/xslifgt
37Med choose
- ltxslchoosegt
- ltxslwhen testvillkor a"gt
- ...kod som utförs om villkor a är sant
- lt/xslwhengt
- ltxslwhen testvillkor b"gt
- ...kod som utförs om villkor b är sant
- lt/xslwhengt
- ltxslotherwisegt
- kod som utförs om varken villkor a eller b är
sant - lt/xslotherwisegt
- lt/xslchoosegt
38Exempel choose
- ltxslchoosegt
- ltxslwhen test"kategori'Deckare'"gt
- ltxslvalue-of select"titel"/gt,32
- är en deckare
- lt/xslwhengt
- ltxslotherwisegt
- ltxslvalue-of select"titel"/gt,32
- är inte en deckare
- lt/xslotherwisegt
- lt/xslchoosegt
39TEI och XSLT
- På samma sätt som en XML-fil kan transformeras
med XSLT kan text uppmärkt med TEI transformeras - Även här används XPath för navigering
40Den TEI-uppmärkta texten
- lt?xml version"1.0" encoding"ISO-8859-1"
standalone"no"?gt - lt!DOCTYPE TEI.2 SYSTEM "http//www.adm.hb.se/mg/d
ig/XMLLab/teilitex.dtd"gt - lt?xml-stylesheet type"text/xsl" href"tei.xsl"?gt
- ltTEI.2gt
- ltteiHeadergt
- ltfileDescgt
- lttitleStmtgt
- lttitlegtThe Life and Opinions of Tristram
Shandy, Gentleman, by Laurence Sterne Electronic
editionlt/titlegt -
- lt/TEI.2gt
41Ett XSLT-skal
- lt?xml version"1.0" encoding"ISO-8859-1" ?gt
- ltxslstylesheet version"1.0" xmlnsxsl"http//ww
w.w3.org/1999/XSL/Transform"gt - ltxsloutput method"text"/gt
- ltxsltemplate match"/"gt
- lthtmlgt
- ltheadgt
- lt/headgt
- ltbodygt
- lt/bodygt
- lt/htmlgt
- lt/xsltemplategt
- lt/xslstylesheetgt
42Lite innehåll
- lthtmlgt
- ltheadgt
- lttitlegtltxslvalue-of select"TEI.2/teiHead
er/fileDesc/ - titleStmt/title"/gtlt/titlegt
- lt/headgt
- ltbodygt
- lth1gtltxslvalue-of select"TEI.2/teiHeader/
fileDesc/ - titleStmt/title"/gtlt/h1gt
- lt/bodygt
- lt/htmlgt
43Hämta allt med for-each
- lth1gt
- ltxslvalue-of select"TEI.2/teiHeader/fileDesc/
- titleStmt/title"/gt
- lt/h1gt
- ltxslfor-each select"/TEI.2//"gt
- ltpgt
- ltxslvalue-of select"."/gt
- lt/pgt
- lt/xslfor-eachgt
44OK, men det ser ju inte så lyckat ut
- /TEI.2// matchar alla noder som befinner sig i
TEI.2 - ltxslvalue-of select"."/gt skriver ut värdet på
den nod som XSLT-processorn pekar på - Om en nod har fler än ett barn kommer innehållet
i denna nod (plus dess barn) att skrivas ut lika
många gånger som antalet barn
45Templates
- ltbodygt
- ltxslapply-templates/gt
- lt/bodygt
- Skriver ut allt
- Ytterligare templates och mer styrning behövs
46Placering av nytt template
- ltxsltemplate match"/"gt
- lthtmlgt
- ltheadgt
- lttitlegt
- ltxslvalue-of select"TEI.2/teiHeader/fileDesc/
titleStmt/title"/gt - lt/titlegt
- lt/headgt
- ltbodygt
- ltxslapply-templates/gt
- lt/bodygt
- lt/htmlgt
- lt/xsltemplategt
- ltxsltemplate match"div"gt
- lt/xsltemplategt
47Två templates infogas
- ltxsltemplate match"div"gt
- ltdiv style"border 3px double black padding
50px width 750px"gt - ltxslapply-templates/gt
- lt/divgt
- lt/xsltemplategt
- ltxsltemplate match"p"gt
- ltpgt
- ltxslapply-templates/gt
- lt/pgt
- lt/xsltemplategt
48Varför skrivs headern ut igen?
- ltbodygt
- ltxslapply-templates/gt
- lt/bodygt
- Skriver ut allt (inklusive teiHeader-noden)
- Detta åtgärdas med hjälp av select
49Uteslutning av överflödig headerinformation
- ltbodygt
- lth1gtltxslvalue-of select "TEI.2/teiHeader/fileD
esc/ - titleStmt/title"/gtlt/h1gt
- ltxslapply-templates select"TEI.2/text/body"/gt
- lt/bodygt
50Att titta på över sommaren
- http//www.w3schools.com/xsl/
- http//www.w3.org/TR/xslt
- Ray, Eric T. (2003). Learning XML. 2. ed.
Sebastopol OReilly. 399 s. - Kompendiet Digitalisering av text