Vapaa ja avoin toimisto-ohjelmisto

XML-asiakirjat » XML-sanakirjan tuonti

Esimerkki4 : XML-sanakirja Writer-asiakirjaksi

Tässä esimerkissä muunnetaan XML-muodossa oleva sanakirja Writer-asiakirjaksi. Tällöin se voidaan viedä edelleen vaikkapa PDF:ksi (xml-sanakirja.pdf).

XML-asiakirja

Käytämme esimerkkinä seuraavanlaista XML-muodossa olevaa sanakirjaa, joka esimerkiksi HTML-muotoon muunnettuna näyttää seuraavanlaiselta:

HakusanaKäännökset
abbreviate (v) lyhentää
accessibility (s) asetukset ja toiminnot, joiden avulla tietokoneen käytöstä tehdään vammaisille helpompaa: esteettömyys (OOo, KDE, Gnome) §, saavutettavuus§, helppokäyttöisyys§
§ Vammaisille tarkoitetuissa palveluissa vakiintunut termi. Ei kuitenkaan ole yleisesti tunnettu.
§§ Vammaisille tarkoitetuissa palveluissa vähemmän suositeltu termi.
§§§ Windowsissa käytetty käännös. Yleisempi ja ymmärrettävämpi kuin oikeampi käännös saavutettavuus.
table (s) 1 (tekstinkäsittely, taulukkolaskenta) taulukko,
2 (tietokanta) taulu

Sanat on jaettu ensinnäkin hakusanoihin (headword), joista voi olla useita sanaluokan (function) mukaisia muotoja. Merkitystasoja on kaksi (sense, subsense). Sanakirjan rakenteesta on saatavilla myös tarkempi kuvaus.

<?xml version="1.0" encoding="iso-8859-15" ?>
<dictionary>
  <headword>
    <entry>abbreviate</entry>
    <function type='verb'>
      <sense id='1'>
        <subsense id='a'>
          <translation id='0'>
            <translated>lyhentää</translated>
          </translation>
        </subsense>
      </sense>
    </function>
  </headword>

  <headword>
    <entry>accessibility</entry>
    <function type='noun'>
      <sense id='1'>
        <subsense id='a'>
          <definition>asetukset ja toiminnot, joiden avulla tietokoneen käytöstä tehdään vammaisille helpompaa</definition>
          <usage>OOo, KDE, Gnome</usage>
          <translation id='0'>
            <translated>esteettömyys</translated>
            <usage>OOo, KDE, Gnome</usage>
            <noteref id='1'/>
          </translation>
          <translation id='1'>
            <translated>saavutettavuus</translated>
            <noteref id='1'/>
          </translation>
          <translation id='2'>
            <translated>helppokäyttöisyys</translated>
            <noteref id='1'/>
          </translation>
        </subsense>
      </sense>
      <notes>
      <note id='1'>Vammaisille tarkoitetuissa palveluissa vakiintunut termi. Ei kuitenkaan ole yleisesti tunnettu.</note>
      <note id='2'>Vammaisille tarkoitetuissa palveluissa vähemmän suositeltu termi.</note>
      <note id='3'>Windowsissa käytetty käännös. Yleisempi ja ymmärrettävämpi kuin oikeampi käännös saavutettavuus.</note>
      </notes>
    </function>
  </headword>
...
  <headword>
    <entry>table</entry>
    <function type='noun'>
      <sense id='1'>
        <subsense id='a'>
          <context>tekstinkäsittely, taulukkolaskenta</context>
          <translation id='0'>
            <translated>taulukko</translated>
          </translation>
        </subsense>
      </sense>
      <sense id='2'>
        <subsense id='a'>
          <context>tietokanta</context>
          <translation id='0'>
            <translated>taulu</translated>
          </translation>
        </subsense>
      </sense>
    </function>
  </headword>
...
</dictionary>

XSLT-muunnin

XSLT-tuontisuodatin muuntaa tuotavan XML-asiakirjan OpenOffice.org-asiakirjan content.xml-tiedostoksi. Alla oleva muunnos muuntaa XML-muotoisen sanakirjan OpenOffice.org 1.1 Writer -asiakirjaksi.

Muunnos koostuu kahdesta pääosasta:

  • asiakirjan rungon määrittelystä ja
  • eri tyyppisten elementtien muunnoksista.

Rungon määrittelyssä määritellään muun muassa useapalstaisen osan tyyli. Muunnoksen loppuosa koostuu erilaisten alirakenteiden muunnoksista.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:office="http://openoffice.org/2000/office"
  xmlns:style="http://openoffice.org/2000/style"
  xmlns:text="http://openoffice.org/2000/text"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  office:class="text"
  office:version="1.0"
  version="1.0">

  <xsl:output indent="yes" encoding="UTF-8"/>

  <!-- ============================================================================ -->
  <!-- Asiakirjan runko.                                                            -->
  <!-- ============================================================================ -->
  <xsl:template match="/">
    <office:document>

      <office:automatic-styles>
        <!-- Osatyyli -->
        <style:style style:name="Sect1" style:family="section">
          <style:properties text:dont-balance-text-columns="false">
            <style:columns fo:column-count="3" fo:column-gap="0.198cm">
              <style:column style:rel-width="3193*" fo:margin-left="0cm" fo:margin-right="0.099cm"/>
              <style:column style:rel-width="3250*" fo:margin-left="0.099cm" fo:margin-right="0.099cm"/>
              <style:column style:rel-width="3194*" fo:margin-left="0.099cm" fo:margin-right="0cm"/>
            </style:columns>
          </style:properties>
        </style:style>
      </office:automatic-styles>

      <office:body>

        <!-- Otsikko -->
        <text:h text:level="1" text:style-name="Heading 1">
          <xsl:text>Sanakirja</xsl:text>
        </text:h>

        <!-- Esittelyteksti -->
        <text:p text:style-name="Text body">
          <xsl:text>Tämä on omassa XML-formaatissa olevasta
          sanakirjasta tuotu Writer-asiakirja.</xsl:text>
        </text:p>

        <!-- Rekursio -->
        <text:section text:style-name="Sect1" text:name="Osa1">
          <xsl:apply-templates select="dictionary/headword/function"/>
        </text:section>

        <text:p text:style-name="Text body"></text:p>
        <text:p text:style-name="Text body">
          <xsl:text>Marko Grönroos, 2003-2005. Kopiointi ja
          tulostaminen sallittu henkilökohtaiseen käyttöön.</xsl:text>
        </text:p>

      </office:body>
    </office:document>
  </xsl:template>

  <!-- ============================================================================ -->
  <!-- Yhden hakusanan tiedot                                                       -->
  <!-- ============================================================================ -->
  <xsl:template match="headword/function">
    <text:p text:style-name="Sana">
      
      <!-- Hakusana -->
      <text:span text:style-name="Hakusana">
        <xsl:value-of select="../entry"/>
      </text:span>
      <xsl:text> </xsl:text>
      <text:span text:style-name="Sanaluokka">
        <xsl:choose>
          <xsl:when test="@type = 'verb'"><xsl:text>v</xsl:text></xsl:when>
          <xsl:when test="@type = 'noun'"><xsl:text>s</xsl:text></xsl:when>
          <xsl:when test="@type = 'adj'"><xsl:text>a</xsl:text></xsl:when>
        </xsl:choose>
      </text:span>
      <xsl:text> </xsl:text>

      <xsl:apply-templates select="sense"/>
      <xsl:apply-templates select="notes"/>
    </text:p>
  </xsl:template>

  <xsl:template match="sense">
    <text:span text:style-name="Merkitys">
      <xsl:value-of select="@id"/>
      <xsl:text> </xsl:text>
    </text:span>

    <xsl:apply-templates select="subsense"/>
  </xsl:template>
  
  <xsl:template match="subsense">
    <xsl:if test="count(../subsense) > 1">
      <text:span text:style-name="Alamerkitys">
        <xsl:value-of select="@id"/>
        <xsl:text> </xsl:text>
      </text:span>
    </xsl:if>

    <xsl:apply-templates select="context"/>
    <xsl:apply-templates select="definition"/>
    <xsl:apply-templates select="translation"/>
  </xsl:template>
  
  <xsl:template match="context|usage">
    <xsl:text> (</xsl:text>
    <text:span text:style-name="Default">
      <xsl:value-of select="."/>
    </text:span>
    <xsl:text>) </xsl:text>
  </xsl:template>

  <xsl:template match="definition">
    <xsl:text> </xsl:text>
    <text:span text:style-name="Default">
      <xsl:value-of select="."/>
    </text:span>
    <xsl:text>. </xsl:text>
  </xsl:template>

  <xsl:template match="definition">
    <xsl:text> </xsl:text>
    <text:span text:style-name="Default">
      <xsl:value-of select="."/>
    </text:span>
    <xsl:text>; </xsl:text>
  </xsl:template>

  <!-- ============================================================================ -->
  <!-- Käännökset (translation)                                                     -->
  <!-- ============================================================================ -->
  <xsl:template match="translation">
    <xsl:apply-templates select="context"/>
    <xsl:apply-templates select="usage"/>
    <xsl:apply-templates select="translated"/>
    <xsl:apply-templates select="ref"/>

    <xsl:if test="position()!=last()">
      <xsl:text>, </xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template match="translated">
    <xsl:text> </xsl:text>
    <text:span text:style-name="Default">
      <xsl:value-of select="."/>
    </text:span>

    <xsl:if test="position()!=last()">
      <xsl:text>, </xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template match="ref">
    <xsl:text>; ks. </xsl:text>
    <text:span text:style-name="Viittaus">
      <xsl:value-of select="."/>
    </text:span>
  </xsl:template>

  <!-- ============================================================================ -->
  <!-- Huomautukset (notes)                                                         -->
  <!-- ============================================================================ -->
  <xsl:template match="notes">
    <xsl:if test="count(note) > 0">
      <text:span text:style-name="Huomautusotsikko">
        <xsl:text> Huomautuksia: </xsl:text>
      </text:span>
      <xsl:apply-templates select="note"/>
    </xsl:if>
  </xsl:template>

  <xsl:template match="note">
    <text:span text:style-name="Huomautusmerkki">
      <xsl:value-of select="substring('§§§§§§§§§', 1, number(@id))"/>
    </text:span>
    <xsl:text> </xsl:text>
    <text:span text:style-name="Huomautus">
      <xsl:value-of select="."/>
    </text:span>
    <xsl:if test="position()!=last()">
      <xsl:text>, </xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Tuontisuodattimen malliasiakirja

Malliasiakirjassa (sanakirja-malli.stw) on määritelty sanakirjan vaatimat kappale- ja merkkityylit. Esimerkiksi headword-elementti sisältö muunnetaan Sana-tyyliseksi kappaleeksi ja sen alaelementit merkkityyleiksi. Esimerkiksi entry-elementissä annettava hakusanan nimi muunnetaan Hakusana-merkkityyliseksi.

Malliasiakirjan sisällöllä ei ole mitään merkitystä ja se poistetaan tuotaessa. Sitä voi kuitenkin käyttää tyylejä suunniteltaessa esimerkkinä.

Tuontisuodattimen käyttö

Tuonti voidaan tehdä OpenOffice.orgin sisällä asentamalla XSLT-muunnin suodattimeksi tai ulkopuolella erillisellä XSLT-käsittelijällä.

Alla on esitetty tuontisuodattimen avulla tuotu asiakirja:

Asiakirja on nyt helposti vietävissä vaikkapa PDF-formaattiin:

Marko Grönroos
magi42@openoffice.org