Litt om XSL - eXtensible Style Language

Hvordan kan vi gjøre et XML-dokument lesbart på Web eller papir? Vi tar en titt på noen XSL-produkter som er kommet til oss.

Trykket i Nettverk & Kommunikasjon nr.3/2000
(c) Anders Fongen 2000

Anders Fongen er høgskolelektor ved Den Polytekniske Høgskolen i Bærum. Webstedet hans er på www.fongen.no

Du kan snart ikke snu deg noe sted i bransjen vår uten å høre ordet XML nevnt. Det er som om hele verden har sittet og ventet på at nettopp denne teknologien skulle komme og løse noen av de problemene som HTML har brakt oss opp i.

XML tilbyr oss å lagre dokumenter på en form som fokuserer på strukturen av informasjonen, mens HTML fokuserer på strukturen av utseendet. Man kan si at HTML bevarer "hvordan?", mens XML besvarer "hva?". Og XML blir da et godt verktøy når informasjon skal overføres eller lagres slik at det blir lett å svare på spørsmålene "hvem skrev dette?", "hvilken versjon er det?", "når ble det skrevet?".

Men XML er ikke den første teknologien som tilbyr en form for egenlaget struktur. Standarder som ASN.1 (og til dels EDIFACT) har for mange år siden adressert dette behovet (som på fint heter "abstrakt syntaks"), men det har vært dyrt og tungvint å lage programmer som baserer seg på ASN.1-koding.

XML har vært rett teknologi til rett tid. Den blir lansert på et tidspunkt hvor det er en alminnelig oppfatning at HTML ikke egner seg til informasjonslagring (bare informasjonspresentasjon). Dessuten ligner XML på HTML, og er et format som tillater at man leser informasjonen uten noen spesialverktøy ("notepad" eller "type" er tilstrekkelig).

Men med XML er altså "hvordan"-spørsmålet ubesvart, dvs. et XML-dokument inneholder (i motsetning til et HTML-dokument) ingen informasjon om hvordan dokumentet skal vises frem. Og det er heller ingenting i et XML-dokument som sier noe om hvilket medium som skal brukes (papir, web-leser, blindeskrift eller talesyntese).

Eget ledd for oversettelse

XML baserer seg på at all fremvisning av informasjon skal skje med separat teknologi. To slike teknologier er allerede utviklet i tidligere sammenhenger: SGML ("storebroren" til XML) har noe som kalles DSSSL (uttales "dazzel"), og fra HTML 4.0 har vi Cascading Style Sheet (CSS). Begge to kan gi oss fremvisningsregler for et XML-dokument, men en ny teknologi, kalt eXtensible Style Language (XSL) har fått mest oppmerksomhet av alle.

En viktig grunn til at XSL har fått så stor interesse er at Microsoft har bestemt seg for å bruke den. Men også er det slik at den representerer en "sunn" mellomting mellom DSSSL, som er meget omfattende og komplisert, og CSS, som er litt "slapp".

XSL baserer seg på at XML-dokumenter skal kombineres med såkalte "style sheets", som inneholder et sett av regler for hvordan delene i XML-dokumentet skal fremstilles. Slik kan XML-dokumenter av samme "klasse" tilbys en felles ressurs for fremstilling, og slik kan også samme XML-dokument gis forskjellig utforming ved å knytte det til et annet stylesheet.

Internet Explorer 5

Det finnes programvare tilgjengelig for å prosessere et XML-dokument med et XSL stylesheet. Et slikt program kalles en "XSL prosessor", og er bl.a. innebygget i Internet Explorer 5. Dessuten finnes det flere Java-biblioteker som gjør denne jobben, fra Lotus og fra Oracle. Begge disse er gratis tilgjengelig, og du kan laste dem ned fra Internet og bruke dem i dine egne Java-applikasjoner. Vi har forsøkt begge to, og anbefaler Oracles Java-bibliotek som er noe mer "sømløst" enn Lotus'.

Internet Explorer 5 kan hente et XML-dokument fra en Web-tjener, finne det tilhørende XSL stylesheet og deretter fremstille dokumentet på skjermen som om det var laget med HTML-koder. Hver XML tag knyttes til noen HTML-koder som mer eller mindre erstattes direkte.

En annen måte å benytte XML/XSL inne i Internet Explorer er gjennom bruk av JavaScript/VBScript. En Web-side kan inneholde en kombinasjon av script-kode og XML-dokumenter (i form av såkalt "data islands") som betyr at XML-dokumentet er "innesluttet" i en HTML-side. Dessverre ganske fjernt fra XML-standardens tenkesett, hvor behandlingsregler og datagrunnlag skal ligge adskilt, men en slik teknikk gir oss muligheten til å lage "interaktive" sider, som f.eks. åpner og lukker avsnitt i informasjonen basert på brukerbetjeningen (ala "outlining").

Programvaren inne i Internet Explorer er bygget som ActiveX-komponenter, noe som gjør at den ikke bare kan brukes innenfra IE5, men også fra programmer skrevet i Visual Basic eller Active Server Pages/VBScript.

Java

Den andre måten å behandle XML/XSL på er i et Java-program. Det finnes som nevnt gode Java-biblioteker for dette, og det å hente inn et XML-dokument, parre det med et XSL stylesheet og skrive ut resultatet (kanskje et HTML-formatert dokument) er et 10-linjers program. Slik kode brukt f.eks. i en Java-Servlet kan lage "XML-tjenere" som behandler XML-formatert informasjon og viser frem HTML-formatert informasjon på en vanlig Web-leser (ikke bare IE5). Ved å skrive slik kode som en "Enterprise Java Bean" kan behandling av XML-dokumenter inngå som en del av en distribuert transaksjon.

Java-basert XML-behandling kan gjøre omtrent det samme som IE5, men i tillegg by på muligheter innen distribuert, transaksjonsorientert og komponentbasert databehandling. Dessuten får man med seg den Java-egenskapen at programmene kan kjøres på alle slags plattformer. Se forøvrig avsnittet om WAP-proxy senere i artikkelen.

Basert på "templates"

Et XSL-dokument er bygget opp med et sett at "templates" (maler). De forteller hva som skal skje med en XML-tag som passer til denne malen. Ofte skal det skje at det skrives ut noen HTML-koder, så innholdet av tagen (det som står mellom og ), og etterpå noen avsluttende HTML-koder. Ofte er XML-tager nøstet inni hverandre, og da er det ønskelig at innholdet ikke skrives direkte ut, men behandles videre i henhold til XSL-malene.

Hvilke XML-tager som passer til en XSL-mal er basert på et regelverk hvor XML-dokumentet under behandling blir betraktet som et "tre av noder", dvs. hvor en tag inni en annen tag blir betraktet som "barn" av den første. Dermed kan reglene si at alle tager som heter passer til en mal, eller en inne i en , eller kun den første av flere -tager.

Dessuten har XSL noen konstruksjoner for å gjøre tester, som f.eks. spørre om denne tagen har et bestemt barn, om det er den første av flere "søkentags", eller om en bestemt attributt eksisterer, og gjøre bestemte aksjoner basert på resultatet. Også en løkkekonstruksjon finner vi i XSL, og da i en form som sier "behandle hver av barna med dette navnet på følgende måte". Noen innebygde funksjoner finnes også i XSL som hjelper disse mekanismene til å bli noe som kanskje kan kalles et hjelpeløst programmeringsspråk.

Oracles Java-bibliotek har dessuten muligheten for å kalle Java-metoder fra et XSL stylesheet, noe som vi ikke har forsøkt selv. Sikkert nyttig, men igjen helt ustandard. XML/XSL gir oss mulighet for en felles bred plattform for hvordan informasjon kan lagres og presenteres, og det er synd om vi allerede nå skulle stikke hull på dette ved å falle for leverandørtriks av denne sorten.

Et eksempel

Plasshensyn tillater ikke at vi behandler XSL på noen grundig eller systematisk måte, derfor blir det kun et eksempel som viser noen hovedtrekk:

Listing 1 viser et enkelt XML-dokument som inneholder opplysninger om en auksjonsrunde. De innledende linjene gir opplysninger om tegnsett og tilknytningen til et stylesheet. Deretter kommer selve informasjonen som skulle være ganske lett å forstå.

Listing 2 viser et XSL stylesheet som fremstiller informasjonen i XML-dokumentet sammen med HTML-koder. I dette eksemplet forsøker vi å vise bruk av løkke- og testoperasjoner, og hvordan vi fra ett sted i XML-treet kan hente frem informasjon fra datternodene. Legg merke til at @-operatoren henter verdien til en attributt, ikke til innholdet av en tag.

Legg disse to filene på samme katalog og åpne XML-dokumentet i Internet Explorer 5 for å studere resultatet.

Oversettelse til andre formater

Det er greit å omsette fra XML- til HTML-format gjennom bruk av XSL stylesheet. Men er det like greit å omsette til f.eks. Rich Text Format (RTF), slik at vi kan vise og redigere dokumentet i en tekstbehandler? Våre forsøk viste at det er mulig, men at det ikke er lett å få kontroll over linjeskift og mellomrom. Disse tegnene betyr som kjent lite i HTML-koding, men RTF-dokumenter krever i noen grad at det er mulig å behandle linjeskift i XML-dokumentet, og det har vi ikke klart å få til.

Vi finner også ut at samme XSL stylesheet ikke duger til bruk både i IE5 og i Java-verktøyet, men at det er noen variasjoner i virkemåten som vi må ta hensyn til.

Kunnskapsterskel

Vi er av den oppfatning at XML er riktig og velproposjonert teknologi til rett tid. Men det knytter seg en betydelig kunnskapsterskel til bruken av XML, ikke minst skyldes dette at den origiale XML-spesifikasjonen er nesten "uleselig". Nå er det kommet en del gode bøker på markedet som kan lette på dette forholdet i fremtiden.

Vi har en lignende følelse knyttet til XSL. Litt eksperimentering med XSL resulterer i ganske store og uoversiktlige stylesheets, og vi antar at kvalitetssikring og vedlikehold av dem vil kreve ganske mye erfaring. Ikke noe "sluttbrukerverktøy", altså

WAP-proxy

Vi har gjort et lite eksperiment med Java-biblioteket til Oracle for XSL-behandling. WAP (du vet, surfing med mobiltelefonen) benytter et kodeformat som heter WML, som baserer seg på XML. Det er mulig å lage et XSL-stylesheet som omsetter WML til HTML, som kan vises i en vanlig Web-leser. Vi har skrevet en HTTP-proxy i Java som henter WML-sider, omsetter dem til HTML og returnerer dataene til en Web-leser.

Har du lyst til å prøve den, kan du sette opp din Web-leser til å bruke "www.fongen.no:8080" (OBS! Ikke lenger i drift) som HTTP-proxy og hente frem f.eks. siden "wap.vg.no". Det knytter seg visse problemer med å lese noen WAP-tjenere på denne måten, fordi det tydeligvis hersker noe forvirring med hensyn til lovlig bruk av tegnsettene (så det er ikke vår skyld at mange sider gir en "encoding not supported.").

Aktuelle Web-lenker:

Finn Java-biblioteket til Oracle her

Finn xsl-spesifikasjonene her

Micrososfts XML nettsted

Listing 1: XML-dokument

<?xml version='1.0' encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="pcworld.xsl" ?>
<auksjon>
   <gjenstand>Garrard platespiller</gjenstand>
   <utrop valuta="NOK" verdi="100"/>
   <bud>
      <navn>Anders Fongen</navn>
      <dato zone="MET">27.02.2000</dato>
      <belop valuta="NOK" verdi="120"/>
   </bud>
   <bud>
      <navn>Kari Holm</navn>
      <dato zone="MET">28.02.2000</dato>
      <belop valuta="NOK" verdi="130"/>
      <kommentar>Bare om den virker</kommentar>
   </bud>
   <bud>
      <navn>Kristin Fæhn</navn>
      <dato zone="MET">29.02.2000</dato>
      <belop valuta="NOK" verdi="150"/>
   </bud>
</auksjon>

Listing 2: XSL-stylesheet

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
   <xsl:template match="/">
      <xsl:apply-templates/>
   </xsl:template>
   <xsl:template match="auksjon">
      <html><head><title>Auto-oversatt XML-dokument
      følger:</title></head><body bgcolor="#e0ffe0">
      <h2>Auksjonsgjenstand:
      <xsl:value-of select="gjenstand"/></h2>
      <h3>Utropspris:
      <xsl:value-of select="utrop/@valuta"/>
      <xsl:value-of select="utrop/@verdi"/></h3>
      Bud hittil: <br/><ul>
      <xsl:for-each select="bud">
         <li><xsl:value-of select="dato"/>
         , <xsl:value-of select="navn"/>
         : <xsl:value-of select="belop/@valuta"/>
           <xsl:value-of select="belop/@verdi"/>
         <xsl:if test="kommentar">
            (<xsl:value-of select="kommentar"/>)
         </xsl:if>
         </li>
      </xsl:for-each>
      </ul>
      </body></html>
   </xsl:template>
   
   <xsl:template match="text()|@*">
      <xsl:value-of select="." /> 
   </xsl:template>

</xsl:stylesheet> 

Bilde: Utseendet av denne kombinasjonen: