XSL
XSL för webbpublicering
Jag fick i uppdrag att ta innehåll och struktur från ett prepress-system och presentera detta i en struktur som liknar en typisk nyhetssajt på nätet som t ex Aftonbladet eller DN.
Innehållet består av texter med typografi-taggar, bilder och alster (objekt som håller i ett antal bilder och texter) och exporteras i form av XML från prepress-systemet. Strukturen utgörs av logiska avdelningar såsom Sporten och Inrikes osv.
I första läget rör det sig om en demo för att visa möjligheter med webbpublicering från ovan nämnda system. Att det är en demo minskar såklart kraven på lösningen. Krav som skulle uppfyllas var dock att visa på dynamiken; att enkelt kunna boka material skapat i systemet för publicering på nätet. Mindre viktigt är prestanda och att stödja alla tänkbara browsers.
XSL - en första anblick
XSL består av två delar: XSLT och XSLFO, där XSLT utgör mekanismer för transformation, medan XSLFO ger tillgång till s k formatting objects.
Formatting objects kan användas för att definiera bl a layout, men har dåligt stöd i webb-världen. Enligt vad jag kunde se så är det i dagsläget mest användbart då slutprodukten skall bli pdf (det finns verktyg som skapar pdf från XML via XSL-bearbetning, t ex FOP).
Kort kan man beskriva XSLT såsom en mekanism för att transformera en XML-fil till en annan fil (av valfritt format) meddelst applicering av en XSL-fil. XSL-filen är i sig en well-formed XML-fil. Oftast används dock nog XSL för att konvertera från XML till HTML.
För mina syften var alltså XSLT den mest intressanta biten. Jag valde att bygga min demo som ett frameset, med en index-list längst till vänster (med entries som motsvarar de logiska avdelningarna på siten) samt en target frame till höger där materialet presenteras. Högst upp toppas det hela av en frame med logotyp och länkar mm.
Vibbar av Lisp och Prolog
Det finns likheter med både Prolog och Lisp i XSL. Rekursion är implicit liksom i Prolog. Vad som skall exekveras styrs av vilka templates man definierat. En template defineras med ett matchningsvillkor som t ex kan trigga på en XML-tags namn eller värdet på ett attribut.
Vidare har man tillgång till kontrollstrukturer som for-each, if, alla med namespace xsl.
En användbar feature när man definierar templates är attributet mode. Genom att i ett visst läge göra apply-templates i en viss mode, kan man styra vilka templates som skall appliceras. Mycket användbart i de fall man traverserar XML-strukturen flera gånger för att åstadkomma olika saker.
Verktyg
För att editera mina XML- och XSL-filer använde jag en utvärderingslicens av verktyget XML Spy. Ett trevligt verktyg för att manipulera XML-filer. Bl a ger den möjlighet att applicera dina XSL-filer. Detta görs med Microsofts XSL-stöd, som tyvärr inte håller måttet.
Bättre ställt med XSL-stödet är det i Netscape 6.1, vilket också blev mål-browsern för demot. Genom att helt enkelt låta Netscape ladda XML-filerna (som i sin tur pekar ut vilken XSL-fil som skall appliceras), tar browsern sedan hand om transformationen. Slutligen appliceras också ett Cascading Style Sheet för typografin.
Problem och lösningar
Vissa problem dök såklart upp. T ex försvårade det faktum att Microsofts XSL-stöd inte höll måttet utvecklingsarbetet på olika sätt. Ett bra sätt att testa sin XSL var i många fall att applicera XSL-en i utvecklingsmiljön och sedan kika på den resulterande HTML-sourcen. Detta gick dock inte efter det att man gått utanför vad Microsofts XSL-stöd medger.
Netscape klarade förvisso i alla fall alla mina XSL-konstruktioner, men när man vill kika på page-source, visar den inte den resulterande HTML-koden, utan den ursprungliga XML-filen. Svårt att debugga alltså.
Inlining av Cascading Style Sheets ville inte heller fungera. Det verkade som om Netscape ignorerade det slutliga steget att applicera style sheetet om den (CSS:en) inte låg i en egen fil.
Prestanda är ju ett annat problem; trots att jag körde lokalt under utvecklingen, så tar det en stund för browsern att knåda filerna till det slutgiltiga resultatet. Här skulle man i en produktionsmiljö självklart vilja ha en miljö som kan förgenerera HTML-filerna. Exempel på en sådan miljö är Cocoon.
Ett problem som jag inte hittade någon lösning på är att generera multipla dokument utifrån ett XML-dokument meddelst XSL. Lösningen här blev att stycka upp den XML som utgjorde indata i mindre bitar, som mera lämpade sig för mina syften. Dock kändes detta som ett visst avsteg från principen om att man med XSL borde kunna göra helt godtyckliga strukturella förändringar av indatat.
/Mikael Printz
|