© Björn Hedin, NADA/KTH XML/XSLT 2D1553 Medieproduktion
© Björn Hedin, NADA/KTH Dagens föreläsning Syfte –Visa hur XML kan användas för att strukturera information och hur XSLT kan användas för att transformera XML-baserad information, vilket är mycket användbart inom publiceringsbranschen Mål –Lära ut hur man skriver DTD:er (tillräckligt för att klara laborationen) –I mån av tid förklara hur XSLT fungerar (tillräckligt för att klara den frivilliga extralaborationen). –Obs! Även XSLT-delen kan förekomma på tentan.
© Björn Hedin, NADA/KTH Vad är XML Ett meta-märkspråk med vilket man kan bygga märkspråk som xhtml, wml, smil etc. Inget exekverande programspråk, endast för att strukturera data. Rekommendation förvaltad av W3C. XML-familjen = XML + relaterade rekommendationer som xslt, xpath, xlink mm.
© Björn Hedin, NADA/KTH Varför XML Vanligaste formatet att lagra data och/eller strukturera informationi filer idag (dock ej binärdata som bilder och video) Standardiserat sätt att beskriva olika typer av innehåll –Enkelt för utvecklare att sätta sig in i andras kod –Man behöver inte uppfinna hjulet på nytt Tillgång till stora mängder mjukvara som förenklar utvecklingsarbete
© Björn Hedin, NADA/KTH Exempel - XHTML Personlig webbsida för Förnamn Efternamn
© Björn Hedin, NADA/KTH Exempel - SMIL
© Björn Hedin, NADA/KTH Element Ett element är den grundläggande informationsenheten i en xml-applikation. Ett element har en start- tag, ett innehåll och en slut-tag. Exempel XML Lecture Start-tag Innehåll Slut-tag
© Björn Hedin, NADA/KTH Simple-, Complex- eller Empty content Simple content - En tag innehåller endast text. Complext content - En tag innehåller en eller flera andra tags och eventuellt text. Empty content - En tag innehåller inget. Exempel XML Lecture har Complex Content har Simple Content har Empty Content Kortversion av
© Björn Hedin, NADA/KTH Attribut Attribut innehåller extra information om ett element T.ex. width på bilder, href på länkar Skrivs på formen <elementnamn attributnamn1=”värde1” attributnamn2=”värde2”> Exempel Link Observera att det går att innesluta attributvärdet antingen ”värde” eller ’värde’, men inte ”värde’ eller ’värde”.
© Björn Hedin, NADA/KTH Attribut eller element? Då man själv gör ett märkspråk ställs man ofta inför valet att koda något som ett attribut eller ett element. Valet är huvudsakligen en smakfråga. Exempel Eller 2s b.jpg
© Björn Hedin, NADA/KTH Föräldrar, barn, syskon Element som innehåller andra element kallas dessa elements förälder. Omvänd relation kallas barn. Element på samma nivå kallas syskon. Exempel HTML XML Lecture html headbody title XML Lecture
© Björn Hedin, NADA/KTH Reserverade tecken Vissa tecken är reserverade då de har speciell betydelse i XML. De kodas som ”entitetsreferenser”. Även svenska tecken kodas oftast som entitetsreferenser Exempel << (less than) >>(greater than> &&(ampersand) ”"(quotation) ’'(apostrophe) ÅÅ ÄÄ ÖÖ å å ä ä ö ö
© Björn Hedin, NADA/KTH CDATA och PCDATA PCDATA = Parsed Character Data. Parsern ersätter entitetsreferenser med deras värde. CDATA = Character Data. Entitetsreferenser tolkas ej. Exempel Om man har många ”konstiga” tecken som man av lathet eller något annat skäl vill skriva in utan entitetsreferenser kan man innesluta tecknen i en CDATA-sektion. Den inleds med strängen &, ’ och ” är alla reserverade tecken ]]>
© Björn Hedin, NADA/KTH Namngivning Namn på tags och attribut måste inledas med en bokstav eller ”_” Därefter bokstäver och/eller siffror. Svenska tecken OK men bör undvikas i praktiken ”xml” reserverat som inledning Godkända exempel Felaktiga exempel
© Björn Hedin, NADA/KTH Well-formed Ett xml-dokument är ”well formed” om det uppfyller ett antal kriterier. Alla xml- dokument måste vara well-formed. Exempel Varje start-tag måste ha en motsvarande slut-tag ( ) Elementen måste bilda en trädstruktur (t.ex. men EJ ) Attributvärden måste omslutas av citat- tecken eller apostrofer. Observera att många html-editorer inte uppfyller något av ovanstående krav. Fullständig lista i kapitel 18 av XML in a nutshell, något mer lättbegripligt på sid 23 i samma bok.
© Björn Hedin, NADA/KTH Processinstruktioner Processinstruktioner kan användas för att skicka vidare information till applikationer. Många applikationer har tidigare använt kommentarer i samma syfte, vilket är dåligt. Exempel <?xml-stylesheet type=”text/xml” href=”my-stylesheet.xsl”?> Denna processinstruktion kan sedan plockas upp exempelvis av en webserver som kan använda informationen till att styra sitt beteende. Processinstruktioner inleds med
© Björn Hedin, NADA/KTH Dokumenttypdeklaration XML-dokument kan även innehålla en Document Type Declaration som anger en eventuell DTD. Exempel imf är i ovanstående fall root-elementet SYSTEM används om det inte är en ”officiell” DTD, annars används PUBLIC URLen är urlen till DTDn Kan även innehålla en så kallad ”public ID”, t.ex. ”-//W3C//DTD XHTML 1.0 Transitional//EN"
© Björn Hedin, NADA/KTH Tag-set Tags och deras attribut för ett visst område kallas ”tag-set”, ”xml application” eller ”xml vocabulary”. Exempel ingår i den tag-set som finns för xhtml men inte för SVG ingår i den tag-set som finns för xsl men inte för xhtml ingår i både xhtml’s tag-set och wml’s tag-set.
© Björn Hedin, NADA/KTH DTD I en Document Type Definition (DTD) definierar man en tag- set och de inbördes relationer som ska gälla. Samma sak kan idag göras med t.ex. XML Schemas. Exempel, och är alla definierade i DTDn för XHTML. I den DTDn anges att ett - element ska innehålla exakt et - element följt av exakt ett element. Detta uttrycks genom följande rad i DTDn
© Björn Hedin, NADA/KTH Valid Om ett XML-dokument är well-formed och uppfyller alla de begränsningar som ges av dess DTD är det ”valid”. Processen att kontrollera detta kallas ”validering” Exempel xhtml-dokument kan valideras på En generell valideringstjänst som klarar andra vokabulärer än xhtml finns på XML Schemas kan valideras på
© Björn Hedin, NADA/KTH DTD - Element Element definieras enligt syntaxen Sekvenser separeras med kommatecken Teckendata skrivs #PCDATA Exempel
© Björn Hedin, NADA/KTH DTD - Repeterande element Default är att ett element förekommer exakt en gång. Vill man ange något annat finns *, + och ? OBS!! Fel på sidan 35 i boken, korrekt till höger. Exempel * betyder 0, 1 eller flera gånger + betyder 1 eller flera gånger ? betyder 0 eller 1 gång Definition Instansdokument hej
© Björn Hedin, NADA/KTH DTD - Grupperingar Parenteser kan användas för att gruppera element. Sedan kan *, + och ? appliceras på hela parentesen som en grupp. Exempel
© Björn Hedin, NADA/KTH DTD - Val För att ange valmöjlighet mellan en mängd element kan operatorn | användas. Exempel
© Björn Hedin, NADA/KTH DTD - Tomma element Tomma element, alltså element utan innehåll deklareras med EMPTY Exempel
© Björn Hedin, NADA/KTH DTD - Blandat innehåll I vissa fall är det önsvärt att kunna blanda teckendata med element. Typexemplet är web. #PCDATA måste vara först i en val-lista. Exempel Deklaration Instansdokument hej hopp tjoho
© Björn Hedin, NADA/KTH DTD - Godtyckligt innehåll Ibland (mycket sällan) är det önskvärt att deklarera ett element som kan ha godtyckligt innehåll. Det görs med ANY. Exempel Elementet everything kan nu innehålla godtycklig well-formed xml och text blandat.
© Björn Hedin, NADA/KTH DTD - Attribut Ett eller flera attribut kan associeras med ett element. Ett attributnamn kan förekomma i flera element, men ett element kan inte ha två attribut med samma namn Exempel <!ATTLIST img src CDATA #REQUIRED width CDATA #REQUIRED heigth CDATA #IMPLIED> img är elementet attributen ska associeras med. src, width, heigth är attributnamn CDATA är attributens datatyp #REQUIRED betyder att attributet måste finnas med, #IMPLIED att det kan finnas med
© Björn Hedin, NADA/KTH Attribut - Datatyper Mycket begränsade ”datatyper” finns. De viktigaste är: CDATA NMTOKEN NMTOKENS ENUMERATIONS ID IDREF IDREFS CDATA - Minst begränsade datatypen. NMTOKEN - Alfanumeriska tecken, _, -,. och :. Inte mellanslag. NMTOKENS - En eller flera NMTOKEN separerade av mellanslag (whitespace) Enumerations - Endast ett av en enumerering värden kan antagas. Definieras exempelvis ID - Unika värden inom XML-dokumentet. Som NMTOKEN men kan inte inledas med en siffra IDREF - Används för interna länkar till attribut av ID-typ. Måste alltså antaga ett värde som ett ID-attribut har. IDREFS - En eller flera IDREF
© Björn Hedin, NADA/KTH Entitetsdeklartioner Entitetsdeklarationer kan användas för att ”skapa alias” för långa eller svåra strängar. Deklareras i en DTD, används i instansdokumenten. Exempel I en DTD I ett instansdokument som använder den DTDn Kursen ges av &mtgp; Slutresultat Kursen ges av Medieteknik och Grafisk Produktion I #PCDATA-sektioner går parsern igenom texten och ersätter entiteter med dess värden.
© Björn Hedin, NADA/KTH Parameterentiteter Entitetsdeklarationer skrivs i en DTD och används i instansdokument. Parameterdeklarationer både skrivs och används i DTDer. Exempel Istället kan man deklarera en parameterentitet
© Björn Hedin, NADA/KTH Interna/Externa DTDer Vanligtvis ligger DTD- deklarationerna i en extern fil. Exempel extern DTD Filen student.dtd Filen student.xml (instansdokumentet) Bjorn Hedin
© Björn Hedin, NADA/KTH Interna/Externa DTDer Det går dock även att inkludera deklarationerna i själva instansdokumentet. Exempel intern DTD <!DOCTYPE student [ ]> Bjorn Hedin
© Björn Hedin, NADA/KTH Problem med DTDer Begränsade datatyper (inga int, long, date…) Begränsade repetitionsalternativ (endast ?, * och +) Endast en betydelse för ett element per DTD DTDer är själva inte XML-dokument. Inga möjligheter till ”arvsmekanismer”. Försök till lösning med XML Schemas, men mer om det nästa gång.
© Björn Hedin, NADA/KTH XSLT eXtensible Stylesheet Language Transformations
© Björn Hedin, NADA/KTH XSLT-exempel. Kurssidan
© Björn Hedin, NADA/KTH Vad är XSLT Ett transformationsspråk som transformerar ett XML- dokument till ett annat XML- eller textdokument. Kan t.ex. användas för att transformera en XML- struktur till XHTML och WML. En del av XSL som förutom XSLT inkluderar XSL- FO. Rekommendation från W3C.
© Björn Hedin, NADA/KTH XSLT-processor XSLT är en rekommendation, inte ett program. Det finns däremot program som kan utföra XSLT- transformationer, sk XSLT- processorer. Xalan och SAXON är vanliga XSLT-processorer. Exempel xml- dokument xslt- dokument xslt- processor Output, t.ex. xhtml
© Björn Hedin, NADA/KTH XSLT vs CSS Precis som för CSS letar man efter mönster (patterns) i en XML- struktur, och när dessa hittas utförs åtgärder (instruction elementss) Till skillnad från CSS är syftet med XSLT att förändra ett XML- träds struktur, inte dess visuella representation. XSLT kan skapa helt nya element, byta ordning på element, välja ut delar av innehållet osv, vilket inte CSS kan. XML-strukturen som är indata kallas ”input-träd” och utdata kallas ”resultat-träd”. CSS har inga resultat-träd.
© Björn Hedin, NADA/KTH Templates Mönstermatchningen görs i elementet tar ett obligatoriskt attribut match som innehåller ett Xpath- uttryck. Elementinnehållet är ett eller flera ”instruction element”, s.k. ”action” Exempel på XSLT-stylesheet [action] [action]
© Björn Hedin, NADA/KTH instruction elements (actions) En action är ett uttryck som bestämmer vad som ska sättas in i resultatträdet när ett visst mönster påträffas. Några vanliga actions är –Sätt in XML-element, attribut och textnoder. –Utför eventuella template-regler för barnelement. –Sätt inte in något alls. Exempel på XSLT-stylesheet
© Björn Hedin, NADA/KTH används för att applicera templates på barn-element till det aktuella elementet i input- trädet. Det har ett frivilligt ”select”- attribut som innehåller en XPath relativt det aktuella elementet. Exempel på XSLT-stylesheet
© Björn Hedin, NADA/KTH Binda XSLT-stylesheets till XML-dokument Det enklaste sättet att binda ett xslt-stylesheet med ett xml-dokument är att ange båda som inparametrar vid anropet av xslt-processorn. Det andra sättet är att ange en processinstruktion i xml- dokumentet med en href till xslt-dokumentet. Vid anrop av XSLT-processorn >java org.apache.xalan.xslt.Process -IN Party.xml -XSL Party.xsl Genom processinstruktion Amphiox Gasque
© Björn Hedin, NADA/KTH Komplett exempel Party.xsl Party.xml Amphiox Gasque output Amphiox Gasque
© Björn Hedin, NADA/KTH Kokboksmetod - 1 Här följer en kokboksmetod för hur man skapar ett stylesheet givet ett visst xml- dokument, t.ex. party.xml. Figurerna till höger kommer användas. Dokumentrooten Processinstruktioner Dokumenttypdeklarationer Element Textnoder
© Björn Hedin, NADA/KTH Kokboksmetod - 1 Party.xml Amphiox Gasque <?xml... <?xsl...<!DOC... Amphiox
© Björn Hedin, NADA/KTH Kokboksmetod - 2 Skapa en template för varje typ av elementnod i trädet (dvs om elementet förekommer fler än en gång i inputdokumentet ska ändå endast en template skapas). Låt ”action” vara Party.xsl
© Björn Hedin, NADA/KTH Kokboksmetod - 3 Tag bort apply-templates från de regler som ska returnera tomt resultat och ta bort eventuella templates som därigenom aldrig blir åtkomliga. Party.xsl
© Björn Hedin, NADA/KTH Kokboksmetod - 4 Lägg till och modifiera action-delen på återstående templates. Exempelvis lägga till och till root-elementets action ifall output ska vara html. Party.xsl
© Björn Hedin, NADA/KTH XSLT-dokument är även XML-dokument Ett XSLT-dokument är ett fullständigt XML- dokument. Det betyder att det måste vara well-formed, dvs exempelvis att alla starttags måste ha motsvarande sluttags på rätt plats. Korrekt template Felaktig template
© Björn Hedin, NADA/KTH Mer om XPath Mönstren i ett match-attribut till ett xsl:template-element är XPath-mönster. De används huvudsakligen för att identifiera en eller flera delar (element, attribut mm) i ett XML-dokument. XPath är en W3C- rekommendation Det finns 7 olika nod-typer i XML-dokument som kan kommas åt via XPath-uttryck. –Root-noden –Elementnoder –Textnoder –Attributnoder –Kommentarnoder –Processinstruktionsnoder –Namespacenoder
© Björn Hedin, NADA/KTH XPath: Root-noden Uttrycket i XPath som matchar root-noden (dvs dokumentet) är ”/”. Jämför filsystemet i Unix eller absoluta sökvägar i URLar. Rootnoden i XPath
© Björn Hedin, NADA/KTH XPath: Elementnoder Elementnoder matchas med sitt namn. Det går att matcha flera element i samma template genom att separera elementnamnen med ”|” Elementnoder i XPath Exempel med flera matchningar i samma template
© Björn Hedin, NADA/KTH XPath: Attributnoder Attribut kan matchas Vad gäller templates är man oftast intresserad av om ett visst element har ett visst attribut och ibland också vad detta attribut har för värde. Attribut i XPath Matchar alla food-element som har ett type- attribut Matchar alla food-element som har ett type- attribut med ett värde som är ”dairy”.
© Björn Hedin, NADA/KTH XPath: Kommentarer processinstruktioner, text Det går även att matcha kommentarnoder, processinstruktionsnoder och textnoder genom speciella XPath- funktioner. Exempel Kommentarer Processinstruktioner Textnoder
© Björn Hedin, NADA/KTH XPath: Hierarkier och wildcards Det går att matcha noder relativt deras position gentemot andra noder. ”Samtliga noder” uttrycks med * Exempel Title-element som är barn till party-element Title-element som är ättlingar till party-element Alla element som är barn till party-element
© Björn Hedin, NADA/KTH XPath: Positionsmatchning Element kan även matchas via sin position. Exempel Det första b-elementet Det sista b-elementet Alla b-element utom det sista Dessutom last-of-any() first-of-any()
© Björn Hedin, NADA/KTH Med går det att plocka ut ”värdet” av ett element eller ett attribut. har ett attribut, ”select”, vilket har ett XPath-värde. Sökvägen utgår från noden där matchningen görs. Exempel
© Björn Hedin, NADA/KTH : ”.” och ”..” ”.” matchar den nod i input-trädet i vilken matchningen görs. ”..” matchar noden ovanför. Jfr unix och dos. Exempel Fest mellan -
© Björn Hedin, NADA/KTH Villkor: XSLT stöder även vissa typer av villkor har ett attribut ”test” som evalueras till sant eller falskt. Om sant så utföres innehållet i tagen, annars inte Exempel
© Björn Hedin, NADA/KTH Villkor: används för if- then-else-konstruktioner. För ”if”-delen används För ”else”-delen används Exempel
© Björn Hedin, NADA/KTH och Ibland kan det vara önskvärt att använda en speciell xslt- konstruktion för att sätta in ett element i resultat-trädet. T.ex. om man vill sätta in ett attribut vars värde måste evalueras. Detta kan göras med Exempel
© Björn Hedin, NADA/KTH Attribute Value Templates Ett smidigt sätt att inkludera värdet härledda värden i ett attribut i resultatträdet utan att använda xsl:attribute är att stoppa in en XPath inom {}. I resultatträdet evalueras värdet inom klamrarna. Exempel FEL (<> får ej finnas i ett attribut) ”>gurka RÄTT gurka
© Björn Hedin, NADA/KTH Med kan man iterera över noder som väljs med ett select- attribut. Exempel
© Björn Hedin, NADA/KTH kopierar den aktuella noden till resultatträdet. Barn-element eller attribut följer inte med. Om noden är en elementnod eller root-nod kan noden ges ett innehåll med en template. Exempel
© Björn Hedin, NADA/KTH kopierar ett trädfragment från input-trädet till resultatträdet. Trädfragmentet lokaliseras med ett select-attribut. Till skillnad från kopieras även attribut, barnelement och ättlingar. Exempel
© Björn Hedin, NADA/KTH kan användas för att placera text i resultat- trädet. Skillnaden är att man kan få in exempelvis & och < i resultatträdet istället för deras entitetsreferenser vilka annars hamnar i resultatträdet. Exempel Hejhopp < >
© Björn Hedin, NADA/KTH , och kan användas för att skapa numreringar. opererar på resultat-trädet Default är att alla noder av samma nodtyp och med samma nodnamn som den aktuella noden räknas. Exempel Foo-element nummer
© Björn Hedin, NADA/KTH generate-id() Funktionen generate-id() används för att skapa en unik identifierare för ett element i källträdet. För varje gång funktionen anropas för ett visst element kommer samma identifierare skapas. Om/när funktionen anropas för ett annat element skapas en annan unik identifierare. Exempel
© Björn Hedin, NADA/KTH Default-templates Om inga templates explicit anges för ett visst mönster finns ett antal default-templates. Attribut- och textnoder Root- och elementnoder Processinstruktion- och kommentarnoder
© Björn Hedin, NADA/KTH Var sker transformerna? I en web-miljö finns tre alternativ för var och när transformerna ska ske. –När dokumentet skapas på servern. T.ex. med Xalan vid en kommandoprompt. –På servern precis när dokumentet ska skickas till klienten. T.ex. med Cocoon, en servlet som kan användas i t.ex. Apache-webservern., eller orionserver som är en egen webserver. –På klienten, i dagsläget IE6 och Mozilla >=1.0. Vilka för- och nackdelar finns med respektive alternativ?
© Björn Hedin, NADA/KTH Mer information Xpath innehåller mycket mer, bland annat en hel del aritmetiska operationer. I kapitel 19 i XML in a nutshell finns en referensmanual. XSLT innehåller ett antal ytterligare element + många trixigheter och features man måste labba med för att upptäcka. Bra källa till kunskap är kapitel 20 i XML in a Nutshell