XSLT
RTF
XSLT
Børre Stenseth
Olympiade >XML2RTF

Et stunt: XML til RTF

Hva

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. (Rich Text Format)

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:

xml2rtf
Fra XML til RTF(TEXT)

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>
Resultatet (åpnes i MS Word) https://borres.hiof.no/wep/xslt/ol/xml2rtf/XSLOutput.rtf

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.

Olympiade >XML2RTF