The Free and Open Productivity Suite
Apache OpenOffice 4.0.1 has been released!

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

Apache Software Foundation

Copyright & License | Privacy | Website Feedback | Contact Us | Donate | Thanks

Apache, the Apache feather logo, and OpenOffice are trademarks of The Apache Software Foundation. OpenOffice.org and the seagull logo are registered trademarks of The Apache Software Foundation. Other names appearing on the site may be trademarks of their respective owners.