Nazaj

Primer uporabe XSLT

XSLT uporabimo za pretvorbo oblikoslovno označenega korpusa, zapisanega v skladu s priporočili TEI, v obliko primerno za branje po mreži, t.j. HTML. Pretvorbo smo implementirali s XSLT procesorjem Xalan.

Za pomoč pri instaliaciji Xalana in za izdelavo uporabljene specifikacije stila gre prisrčna zahvala Laurentu Romaryu in, posredno, združenju TELRI.


Vhodna datoteka

Vhodna datoteka je prvi odstavek slovenskega prevoda romana '1984', G. Orwella. Ostavek je označen s stavki (povedmni), ti pa z besedami in ločili. Vsaki besedi je tudi pripisana njena oblikoslovna oznaka in lema. Korpus je zapisan v skladu s priporočili TEI, primer pa nato (trivialno) spremenjen v XML.
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<text id="Osl." lang="sl">
<body>
<div type="part" id="Osl.1">
<div type="chapter" id="Osl.1.2">
<p id="Osl.1.2.2">
<s id="Osl.1.2.2.1">
<w lemma="biti" ana="Vcps-sma">Bil</w>
<w lemma="biti" ana="Vcip3s--n">je</w>
<w lemma="jasen" ana="Afpmsnn">jasen</w>
<c>,</c>
<w lemma="mrzel" ana="Afpmsnn">mrzel</w>
<w lemma="aprilski" ana="Aopmsn">aprilski</w>
<w lemma="dan" ana="Ncmsn">dan</w>
<w lemma="in" ana="Ccs">in</w>
<w lemma="ura" ana="Ncfpn">ure</w>
<w lemma="biti" ana="Vcip3p--n">so</w>
<w lemma="biti" ana="Vmps-pfa">bile</w>
<w lemma="trinajst" ana="Mcnpnl">trinajst</w>
<c>.</c>
</s>
<s id="Osl.1.2.2.2">
<w lemma="Winston" ana="Npmsn">Winston</w>
<w lemma="Smith" ana="Npmsn">Smith</w>
<w lemma="biti" ana="Vcip3s--n">je</w>
<w lemma="imeti" ana="Vmps-sma">imel</w>
<w lemma="brada" ana="Ncfsa">brado</w>
<w lemma="zakopan" ana="Afpfsa">zakopano</w>
<w lemma="v" ana="Spsa">v</w>
<w lemma="prsi" ana="Ncfpa">prsi</w>
<c>,</c>
<w lemma="da" ana="Css">da</w>
<w lemma="biti" ana="Vcc">bi</w>
<w lemma="uiti" ana="Vmps-sma">ušel</w>
<w lemma="strupen" ana="Afpmsd">strupenemu</w>
<w lemma="veter" ana="Ncmsd">vetru</w>
<c>,</c>
<w lemma="ko" ana="Css">ko</w>
<w lemma="biti" ana="Vcip3s--n">je</w>
<w lemma="stopiti" ana="Vmps-sma">stopil</w>
<w lemma="skozi" ana="Spsa">skozi</w>
<w lemma="steklen" ana="Afpnpa">steklena</w>
<w lemma="vrata" ana="Ncnpa">vrata</w>
<w lemma="blok" ana="Ncmsg">bloka</w>
<w lemma="zmaga" ana="Ncfsn">Zmaga</w>
<c>,</c>
<w lemma="vendar" ana="Ccs">vendar</w>
<w lemma="ne" ana="Q">ne</w>
<w lemma="dovolj" ana="Rgp">dovolj</w>
<w lemma="hiter" ana="Rgp">hitro</w>
<c>,</c>
<w lemma="da" ana="Css">da</w>
<w lemma="ne" ana="Q">ne</w>
<w lemma="biti" ana="Vcc">bi</w>
<w lemma="vrtinec" ana="Ncmsn">vrtinec</w>
<w lemma="peščen" ana="Afpmsg">peščenega</w>
<w lemma="prah" ana="Ncmsg">prahu</w>
<w lemma="vstopiti" ana="Vmps-sma">vstopil</w>
<w lemma="skupaj" ana="Rgp">skupaj</w>
<w lemma="z" ana="Spsi">z</w>
<w lemma="on" ana="Pp3msi--n-n">njim</w>
<c>.</c>
</s>
</p>
</div>
</div>
</body>
</text>

Izhodna datoteka

Pri pretvorbi v HTML je bila glavna naloga narediti besedilo bolj berljivo; hoteli smo doseči tabelaričen prikaz, kjer so oznake poravnane pod besedami in barvno označene.

Testna datoteka v HTML je v tst.html, tu pa je celo prvo poglavje. Zapis ilustriramo spodaj:

<html>
<body>
<H1>part=Osl.1</H1>
<H1>chapter=Osl.1.2</H1>
<P>
<BR>
<TABLE CELLSPACING="1" BORDER="0" width="100%" align="center">
<TR>
<TD>Bil</TD><TD>je</TD><TD>jasen</TD><TD>,</TD><TD>mrzel</TD><TD>aprilski</TD><TD>dan</TD><TD>in</TD><TD>ure</TD><TD>so</TD><TD>bile</TD><TD>trinajst</TD><TD>.</TD>
</TR>
<TR>
<TD><SMALL>
<FONT color="blue">Vcps-sma</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Vcip3s--n</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Afpmsnn</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">
</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Afpmsnn</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Aopmsn</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Ncmsn</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Ccs</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Ncfpn</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Vcip3p--n</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Vmps-pfa</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">Mcnpnl</FONT>
</SMALL></TD><TD><SMALL>
<FONT color="blue">
</FONT>
</SMALL></TD>
</TR>

XSL Transformacija

XSLT deklarativno določa transformacije med dokumenti XML. Določitev konkretne tranformacije je dokument XML, ki uporablja 'namespace' koncept sklicevanja na DTDje.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/">
  <html>
    <body>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="div">
  <H1><xsl:value-of select="@type"/>=<xsl:value-of select="@id"/></H1>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="p">
  <P>
    <xsl:apply-templates/>
  </P>
</xsl:template>

<xsl:template match="s">
<BR/>
<TABLE align="center" width="100%" BORDER="0" CELLSPACING="1">
  <TR>
    <xsl:for-each select="w|c">
      <TD>
        <xsl:value-of select="."/>
      </TD>
    </xsl:for-each>
  </TR>
  <TR>
    <xsl:for-each select="w|c">
      <TD><SMALL><FONT color="blue">
        <xsl:value-of select="@ana"/>
      </FONT></SMALL></TD>
    </xsl:for-each>
  </TR>
  <TR>
    <xsl:for-each select="w|c">
      <TD><SMALL><FONT color="green">
        <xsl:value-of select="@lemma"/>
      </FONT></SMALL></TD>
    </xsl:for-each>
  </TR>
</TABLE>
</xsl:template>
</xsl:stylesheet>

XML / XSLT procesor Xalan

Xalan je del projekta Apache XML, in implementira XSLT in XPath. Xalan je prosto dostopen; za delovanje potrebuje JDK ali Java Runtime 1.1.8 ali 1.2.2.

Preiskus: stavljenje celotnega romana '1984' s Xalanom na Linux/Pentium.

Velikost vhoda:

$du tst-sl.xml
3972    tst-sl.xml

$tagcount < tst-sl.xml 
<tagusage gi=div occurs=29></tagusage>
<tagusage gi=p occurs=1288></tagusage>
<tagusage gi=s occurs=6689></tagusage>
<tagusage gi=w occurs=90792></tagusage>
<tagusage gi=c occurs=21486></tagusage>
Transform:
$ time java org.apache.xalan.xslt.Process \
-in tst-sl.xml -xsl msd.xsl -out tst-sl.html
========= Parsing file:msd.xsl ==========
Parse of file:msd.xsl took 785 milliseconds
========= Parsing file:tst-sl.xml ==========
Parse of file:tst-sl.xml took 13831 milliseconds
=============================
Transforming...
transform took 46612 milliseconds
XSLProcessor: done

50.61user 2.33system 1:03.83elapsed 82%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (5388major+3495minor)pagefaults 407swaps

Nazaj


2000-12-03, et