<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
  <!ENTITY versio "1.2b">
]>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <!-- 
    piv_essai.xsl

    Aplikebla kiel stilfolio al piv2.xml
  -->

  <!--
    Diversaj listoj
  -->
  
  <xsl:key name="radikoj" 
           match="//radiko" 
           use="translate(kap,'ABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ','abcĉdefgĝhĥijĵklmnoprsŝtuŭvz')"/>

  <xsl:key name="O-radikoj" 
           match="//radiko[@kat = 'o']" 
           use="kap"/>

   <xsl:key name="O-kunmetaĵoj" 
           match="//radiko/drv[(substring-after(@strukt,'~') = 'o') and (@strukt != '~o')]" 
           use="@form"/>

  <xsl:variable name="minuskloj" select="'abcĉdefgĝhĥijĵklmnoprsŝtuŭvz'"/>
  <xsl:variable name="majuskloj" select="'ABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ'"/>
  
  <xsl:output method="html"/>


  <xsl:template match="/">
    <HTML>
      <HEAD>
        <link type="text/css" rel="stylesheet" href="piv.css" />
        <TITLE>Kapvortoj en PIV2</TITLE>
        <style type="text/css">
          <![CDATA[
            BODY {
              font-family: Arial;
              margin-right: 0.5cm;
            }
            H2 {
              font-size: 160%; 
              font-style: normal; font-weight: bolder;
              text-align: center;
            }
            H4 {
              margin-left: 1cm;
              font-size: 140%; 
              font-style: normal; font-weight: bolder;
            }
            H5 {
              margin-left: 1.5cm;
              font-size: 120%; 
              font-style: italic; font-weight: bolder;
            }
            P {
              margin-left: 2cm;
              text-align: justify;
            }
            UL {
              margin-left: 3cm;
            }
            UL.interna {
              margin-left: 1cm;
            }
            .rezultoj {
              font-size: 90%; 
              text-align: justify;
            }
          ]]>
        </style>

      </HEAD>
      <BODY>
      <CENTER>Versio &versio;<p/></CENTER>
      <HR size="5"/>

      <H2>Datumbazo de kapvortoj en PIV2</H2>

      <H4>1. Deveno de la datumbazo</H4>

      <P>Por ellabori ĉi tiun datumbazon mi uzis la liston, kuŝantan en la
      reto, ĉe la adreso 
      <A HREF="http://rano.org/vortaroj.html">
                http://rano.org/vortaroj.html</A>.
      La liston mi konvertis al XML-formato, uzante Perl-an skripton.</P>

      <UL class="interna">
      <P>La rezultanta XML-dosiero estas trovebla <A HREF="piv2.xml">ĉi tie</A> (4 Mbajt),
      ĝia dokumenttipdifino <A HREF="piv2.dtd">ĉi tie</A>
      kaj ĝia sĥemo <A HREF="piv2.xsd">ĉi tie</A>.</P>

      <P>Ĉi tiu TTT-paĝo estis kreita per aplikado de ekzempla XSLT-stilfolio al la
      datumbazo. La stilfolio estas trovebla <A HREF="piv_essai.xsl">ĉi tie</A>.</P>
      </UL>


      <H4>2. Uz-ekzemploj</H4>

      <P>Mi faris XSLT-stilfolion por montri, kiamaniere kaj kiucele eblas traserĉi la
      datumbazon. Cetere la rezultoj de traserĉado ebligis korekti kelkajn erarojn en la
      listo, inter kiuj kelkaj enestas en PIV2 mem. </P>

      <P>Jen la ekzemploj:</P>

      <UL>
        <LI>Diversaj teĥnikaj radikkategorioj</LI>
        <UL class="interna">
          <LI><A HREF="#literoj">Listo de Esperantaj literoj</A></LI>
          <LI><A HREF="#mallongigoj">Listo de mallongigoj</A></LI>
          <LI><A HREF="#interjekcioj">Listo de primitivaj interjekcioj kaj sonimitoj</A></LI>
          <LI><A HREF="#finaĵoj">Listo de finaĵoj</A></LI>
          <LI><A HREF="#E-afiksoj">Listo de Esperantaj afiksoj</A></LI>
          <LI><A HREF="#sc-afiksoj">Listo de sciencaj afiksoj</A></LI>
          <LI><A HREF="#kat_memstara">Listo de vortoj el radiko kun kategorio "memstara"</A></LI>
          <LI><A HREF="#kat_pruntita">Listo de vortoj el radiko kun kategorio "pruntita"</A></LI>
          <LI><A HREF="#alie">Listo de elementoj konsidereblaj kiel kunmetaĵoj</A></LI>
        </UL>
        <LI>Specifaj radikoj</LI>
        <UL class="interna">
          <LI><A HREF="#kat_e">Listo de "adverbaj" radikoj</A></LI>
          <LI><A HREF="#kat_o">Listo de substantivaj radikoj, komenciĝantaj per v</A></LI>
          <LI><A HREF="#homonimoj">Listo de homonimaj radikoj</A></LI>
        </UL>
        <LI>Specifaj kunmetaĵoj</LI>
        <UL class="interna">
          <LI><A HREF="#derivitaj_sufiksoj">Listo de derivitaj sufiksoj</A></LI>
          <LI><A HREF="#derivitaj_interjekcioj">Listo de derivitaj interjekcioj</A></LI>
          <LI><A HREF="#derivaĵoj_de_interjekcioj">Listo de derivaĵoj de interjekcioj</A></LI>
          <LI><A HREF="#derivaĵoj_de_memstaraj">Listo de la derivaĵoj de memstaraj radikoj, 
            kiuj finiĝas per la nuda radiko</A></LI>
          <LI><A HREF="#ujo">Listo de ujo-derivaĵoj</A></LI>
          <LI><A HREF="#substantivaj_kunmetaĵoj">Listo de substantivaj kunmetaĵoj, komenciĝantaj
            per litero a</A></LI>
          <LI><A HREF="#a_kunmetaĵoj_kun_o_flankelemento">Listo de adjektivaj kunmetaĵoj kun
            substantiva flankelemento</A></LI>
        </UL>
        <LI>Diversaj listoj kontrolcelaj</LI>
        <UL class="interna">
          <LI><A HREF="#kunmetaĵoj_kun_spaceto">Listo de kunmetaĵoj kun spaceto</A></LI>
          <LI><A HREF="#kunmetaĵoj_kun_streketo">Listo de kunmetaĵoj kun streketo</A></LI>
          <LI><A HREF="#majusklaj_derivaĵoj">Listo de majusklitaj derivaĵoj de majusklita 
          radiko</A></LI>
          <LI><A HREF="#minusklaj_derivaĵoj">Listo de minusklitaj derivaĵoj de majusklita 
          radiko</A></LI>
          <LI><A HREF="#majusklaj_adjektivoj">Listo de majusklitaj adjektivaj kapvortoj</A></LI>
        </UL>
      </UL>

      <HR SIZE="5"/>

      <A NAME="literoj"/>
      <H5>Listo de Esperantaj literoj</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'litero'"/>
        </xsl:call-template>
      </P>
      
      <A NAME="mallongigoj"/>
      <H5>Listo de mallongigoj</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'mallongigo'"/>
        </xsl:call-template>
      </P>
      
      <A NAME="interjekcioj"/>
      <H5>Listo de primitivaj interjekcioj kaj sonimitoj</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'interjekcio'"/>
        </xsl:call-template>
      </P>

      <A NAME="finaĵoj"/>
      <H5>Listo de finaĵoj</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'finaĵo'"/>
        </xsl:call-template>
      </P>

      <A NAME="E-afiksoj"/>
      <H5>Listo de Esperantaj afiksoj</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'prefikso'"/>
        </xsl:call-template>
      </P>
      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'sufikso'"/>
        </xsl:call-template>
      </P>

      <A NAME="sc-afiksoj"/>
      <H5>Listo de sciencaj afiksoj</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'sc_prefikso'"/>
        </xsl:call-template>
      </P>
      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'sc_sufikso'"/>
        </xsl:call-template>
      </P>

      <A NAME="kat_memstara"/>
      <H5>Listo de vortoj el radiko kun kategorio "memstara" (uzataj senfinaĵe)</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'memstara'"/>
        </xsl:call-template>
      </P>

      <A NAME="kat_pruntita"/>
      <H5>Listo de vortoj el radiko kun kategorio "pruntita" (uzataj senfinaĵe)</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'pruntita'"/>
        </xsl:call-template>
      </P>

      <A NAME="alie"/>
      <H5>Listo de elementoj konsidereblaj kiel kunmetaĵoj</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko[@alie = 'jes']">
          <xsl:sort select="@ord"/>
          <xsl:value-of select="drv[1]/@form"/> 
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="kunmetaĵoj_kun_spaceto"/>
      <H5>Listo de kunmetaĵoj kun spaceto</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko/drv[position() != 1 and contains(@form,' ')]">
          <xsl:sort select="../@ord"/>
          <xsl:value-of select="@form"/> 
          <xsl:text> (</xsl:text><xsl:value-of select="../kap"/><xsl:text>)</xsl:text>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="kunmetaĵoj_kun_streketo"/>
      <H5>Listo de kunmetaĵoj kun streketo</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko/drv[position() != 1 and contains(@form,'-')]">
          <xsl:sort select="../@ord"/>
          <xsl:value-of select="@form"/> 
          <xsl:text> (</xsl:text><xsl:value-of select="../kap"/><xsl:text>)</xsl:text>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="derivitaj_sufiksoj"/>
      <H5>Listo de derivitaj sufiksoj</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko/drv[starts-with(@strukt,'-')]">
          <xsl:value-of select="@form"/>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="derivitaj_interjekcioj"/>
      <H5>Listo de derivitaj interjekcioj</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko/drv[contains(@strukt,'!')]">
          <xsl:value-of select="@form"/>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="derivaĵoj_de_interjekcioj"/>
      <H5>Listo de derivaĵoj de interjekcioj</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko[@kat = 'interjekcio']/drv[position() > 1]">
          <xsl:value-of select="@form"/>
          <xsl:text> (</xsl:text><xsl:value-of select="../kap"/><xsl:text>)</xsl:text>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="derivaĵoj_de_memstaraj"/>
      <H5>Listo de la derivaĵoj de memstaraj radikoj, kiuj finiĝas per la nuda radiko</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko[@kat = 'memstara']/drv[(position() > 1) and (substring(@strukt,string-length(@strukt),1) = '~')]">
          <xsl:value-of select="@form"/>
          <xsl:text> (</xsl:text><xsl:value-of select="../kap"/><xsl:text>)</xsl:text>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="ujo"/>
      <H5>Listo de ujo-derivaĵoj (nefidinda, ĉar la vortoj de tipo ~/Y/ujo
      ne estas trovitaj ĉi-maniere)</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko/drv[substring-after(@strukt, '~') = 'ujo']">
          <xsl:value-of select="@form"/>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="substantivaj_kunmetaĵoj"/>
      <H5>Listo de substantivaj kunmetaĵoj, komenciĝantaj per litero a</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko/drv[(@form = key('O-kunmetaĵoj',@form)/@form)
                                       and (substring(@form,1,1) = 'a')]">
          <xsl:value-of select="@form"/>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="kat_e"/>
      <H5>Listo de "adverbaj" radikoj</H5>

      <P class="rezultoj">
        <xsl:call-template name="serĉu_kategorion">
          <xsl:with-param name="kategorio" select="'e'"/>
        </xsl:call-template>
      </P>

      <A NAME="kat_o"/>
      <H5>Listo de substantivaj radikoj, komenciĝantaj per v</H5>

      <P class="rezultoj">
        <xsl:for-each select="//radiko[key('O-radikoj',kap)
                                  and (substring(kap,1,1) = 'v')]">
          <xsl:sort select="@ord"/>
          <xsl:value-of select="kap"/>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="homonimoj"/>
      <H5>Listo de homonimaj radikoj</H5>

      <P class="rezultoj">
        <xsl:for-each 
          select="//radiko[(key('radikoj',translate(kap,$majuskloj,$minuskloj))[1 != last()])
                       and (key('radikoj',translate(kap,$majuskloj,$minuskloj))[1]/@id = @id)]">
          <xsl:sort select="@ord"/>
          <b><xsl:value-of 
            select="translate(kap,$majuskloj,$minuskloj)"/></b><xsl:text>: </xsl:text>

          <xsl:for-each select="key('radikoj',translate(kap,$majuskloj,$minuskloj))">
            <xsl:sort select="drv[1][not(@maj)]/@ord"/>
            <xsl:sort select="drv[1][@maj = 'jes']/@ord"/>
            <xsl:variable name="form" select="drv[1]/@form"/>
            
            <!-- Eventuale majuskligi la derivaĵon -->
            
            <xsl:choose>
              <xsl:when test="drv[1]/@maj = 'jes'">
                <xsl:value-of 
                  select="concat(translate(substring($form,1,1), $minuskloj, $majuskloj), 
                          substring($form,2,string-length($form)-1))"/>
              </xsl:when>
              <xsl:otherwise>
                <xsl:value-of select="$form"/>
              </xsl:otherwise>
            </xsl:choose>
            
            <!-- Indiki la kategorion kaj fakojn -->
            
            <xsl:choose>
              <xsl:when test="not(contains('aieo',@kat))">
                <xsl:text> (</xsl:text>
                  <xsl:value-of select="@kat"/>
                <xsl:text>)</xsl:text>
              </xsl:when>
              <xsl:when test="drv[1]/pref">
                <xsl:text> (=</xsl:text>
                  <xsl:value-of select="drv[1]/pref"/>
                <xsl:text>)</xsl:text>
              </xsl:when>
              <xsl:when test="drv[1]/fak or drv[1]/div">
                <xsl:text> (</xsl:text>
                  <xsl:for-each select="drv[1]/fak | drv[1]/div">
                    <xsl:value-of select="."/>
                    <xsl:if test="position() != last()">
                      <xsl:text>, </xsl:text>
                    </xsl:if>
                    </xsl:for-each>
                <xsl:text>)</xsl:text>
              </xsl:when>
              <xsl:otherwise/>
            </xsl:choose>
            <xsl:if test="position() != last()">
              <xsl:text>, </xsl:text>
            </xsl:if>
          </xsl:for-each>
          <br/>
        </xsl:for-each>
      </P>

      <A NAME="a_kunmetaĵoj_kun_o_flankelemento"/>
      <H5>Listo de adjektivaj kunmetaĵoj kun substantiva flankelemento
      (nefidinda, ĉar la programo ne kapablas distingi homonimajn radikojn)</H5>

      <P class="rezultoj">
        <xsl:for-each 
          select="//radiko/drv[
            (substring-after(@strukt,'~') = 'a') and
            (key('O-radikoj',substring-before(@strukt,'~'))/kap = substring-before(@strukt,'~'))]">
          <xsl:sort select="@ord"/>
          <xsl:if test="not(contains('.al.bel.ĉi.el.en.mal.por.sen.sin.sur.',
                                     concat('.',substring-before(@strukt,'~'),'.')))">
                        <!-- forigas la plej ĝenajn nesubst. flankelementojn -->
            <xsl:value-of select="@form"/>
            <xsl:choose>
              <xsl:when test="position() = last()">
                <br/>
              </xsl:when>
              <xsl:otherwise>
                <xsl:text>, </xsl:text>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:if>
        </xsl:for-each>
      </P>

      <A NAME="majusklaj_derivaĵoj"/>
      <H5>Listo de majusklitaj derivaĵoj de majusklitaj radikoj (inkluzive de tiuj, 
          por kiuj PIV2 ne prenas partion)</H5>

      <P class="rezultoj">
        <xsl:for-each 
          select="//radiko[contains($majuskloj, substring(kap,1,1))]/drv[position() > 1 and
                           (contains(@form, substring(../kap,1,1)))]">
          <xsl:sort select="@ord"/>
          <xsl:value-of select="@form"/>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="minusklaj_derivaĵoj"/>
      <H5>Listo de minusklitaj derivaĵoj de majusklitaj radikoj (la radiko aperas minuskle)</H5>

      <P class="rezultoj">
        <xsl:for-each 
          select="//radiko[contains($majuskloj, substring(kap,1,1))]/drv[position() > 1 and
                           not(contains(@form, substring(../kap,1,1)))]">
          <xsl:sort select="@ord"/>
          <xsl:value-of select="@form"/>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      <A NAME="majusklaj_adjektivoj"/>
      <H5>Listo de majusklitaj adjektivaj kapvortoj</H5>

      <P class="rezultoj">
        <xsl:for-each 
          select="//radiko[@kat = 'a' and
                           contains($majuskloj, substring(kap,1,1)) and 
                           contains(drv[1]/@form, substring(kap,1,1))]">
          <xsl:sort select="drv[1]/@ord"/>
          <xsl:value-of select="drv[1]/@form"/>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <br/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>, </xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </P>

      </BODY>
    </HTML>
  </xsl:template>

  <!-- Subprogramoj -->
  
  <xsl:template name="serĉu_kategorion">
    <xsl:param name="kategorio"/>
    <xsl:for-each select="//radiko[@kat = $kategorio]">
      <xsl:sort select="@ord"/>
          
      <!-- Eventuale majuskligi la derivaĵon -->
      
      <xsl:variable name="form" select="drv[1]/@form"/>
      <xsl:choose>
        <xsl:when test="drv[1]/@maj = 'jes'">
          <xsl:value-of 
            select="concat(translate(substring($form,1,1), $minuskloj, $majuskloj), 
                    substring($form,2,string-length($form)-1))"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$form"/>
        </xsl:otherwise>
      </xsl:choose>
       
      <xsl:choose>
        <xsl:when test="position() = last()">
          <br/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>, </xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>
<!-- vim:et:ts=2:sw=2:keymap=unicode:enc=utf-8
-->
