Et stunt: XML til RTF
Uten å kjenne særlig til RTF (Rich Text Format) skal vi prøve å ta data fra en xml-struktur og pakke dem inn i en rtf-fil. Framgangsmåten er som følger:
- Bruk Word og lag et dokument som skal tjene som skjelett.
- Spar denne fila som rtf.
- Åpne fila i en ren texteditor og analyser innholdet.
- Klipp ut de formateringsbitene som danner skjelettet rundt de tekstbitene vi skal introdusere.
- Legg formateringsbitene inn i en xsl-fil
- Kjør en transformasjon med kildefila (xml) og den nye xsl-fila
- Spar resultatet som rtf og ta den opp i Word
Med tanke på enkelhet og gjenbruk skiller vi de aktuelle teksbitene fra rtf-formatet ut i en egen xsl-fil, rtf_template.xsl, som vi inkluderer i hoved xsl-fila: olymp_rtf.xslt. Slik:
Rtf-stoffet, rtf_template.xsl, ser slik ut:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" version="1.0" encoding="utf-8"/> <xsl:template name="BIGHEADER"> <xsl:text>... uforståelig rtf formater ...</xsl:text> </xsl:template> <xsl:template name="H1PSTART"> <xsl:text>... uforståelig rtf formater ...</xsl:text> </xsl:template> <xsl:template name="H2PSTART"> <xsl:text>... uforståelig rtf formater ...</xsl:text> </xsl:template> <xsl:template name="H3PSTART"> <xsl:text>... uforståelig rtf formater ...</xsl:text> </xsl:template> <xsl:template name="PPSTART"> <xsl:text>... uforståelig rtf formater ...</xsl:text> </xsl:template> <xsl:template name="PSTOP"> <xsl:text>... uforståelig rtf formater ...</xsl:text> </xsl:template> <xsl:template name="NEWLINE"> <xsl:text>\line </xsl:text> </xsl:template> </xsl:stylesheet>
De formateringskomponentene vi har brukt er i klartekst:
BIGHEADER - en stor blokk som er prologen i rtf-fila
H1PSTART - starten på et Heading1 - avsnitt
H2PSTART - starten på et Heading2 - avsnitt
H3PSTART - starten på et Heading3 - avsnitt
PPSTART - starten på et normal- avsnitt
PSTOP - avslutning på et avsnitt
NEWLINE - et enkelt linjeskift
Teknikken blir da at vi kaller den riktige templaten når vi skal ha ut en slik tekstbit:
<xsl:call-template name="BIGHEADER"/>
Fila olymp_rtf.xslt er den som er "ansvarlig" translator, og vi må inkludere våre rtf-templates i denne:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="utf-8" /> <xsl:include href="rtf_template.xsl"/> <xsl:template match="/"> ...
Transformasjonen olymp-rtf.xslt er slik:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:include href="rtf_template.xsl"/> <xsl:template match="/"> <xsl:call-template name="BIGHEADER"/> <xsl:call-template name="H1PSTART"/> <xsl:text>Olympiske sprintfinalister</xsl:text> <xsl:call-template name="PSTOP"/> <xsl:for-each select="IOC/OlympicGame"> <xsl:call-template name="H2PSTART"/> <xsl:value-of select="@place"/> <xsl:text> </xsl:text> <xsl:value-of select="@year"/> <xsl:call-template name="PSTOP"/> <xsl:for-each select="event"> <xsl:call-template name="H3PSTART"/> <xsl:value-of select="@dist"/> <xsl:call-template name="PSTOP"/> <xsl:call-template name="PPSTART"/> <xsl:for-each select="athlet"> <xsl:call-template name="NEWLINE"/> <xsl:value-of select="name"/> </xsl:for-each> <xsl:call-template name="PSTOP"/> </xsl:for-each> </xsl:for-each> <xsl:text>}</xsl:text> </xsl:template> </xsl:stylesheet>
For å lage en rimelig sikker og fleksibel rtf-translasjon må vi selvsagt trenge lenger inn i rtf, og vi vil trolig finne det hensiktsmessig å bygge opp løsningen på en helt annen måte. Imidlertid kan vi godt tenke oss at vi kan implementere en løsning som ligner på denne dersom vi har en fast xml-struktur som skal rapporteres på en fast måte i et brukermiljø som kan nyttigjøre seg rtf.