[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] how to recycle code to process the same element more than once


Subject: [xsl] how to recycle code to process the same element more than once
From: Manuel Souto Pico <manuel.souto@xxxxxxxxxxxxxx>
Date: Fri, 13 Feb 2009 12:27:55 +0100

Hello everyone,

This is a question about a transformation from a dictionary format that encodes language as an attribute of each term to another (ISO-standard) format in which all terms in each language are grouped under a language element (the language is their parent). I managed to do that, no problem there.

However, I know my code could be improvable at least in one thing: I write the same transformation for each language and in this case it's not too bad because there's only three languages, but that implies I first need to check how many languages there are and that I need to have longer, duplicated code. It would be a pain if there were many languages... (which might be the case in the future).

I tried doing this with a for-each for each term[@lang='es'] but to no avail (I think I could do it for elements but the problem is that the pivot data is an attribute). I also tried to figure out how that could be done with templates (because in Perl I would do it with a subroutine) but I guess I need to pass the language as a variable and I don't know how to do that.

The question is: how could I write the code that process each langSet only once for all langSets instead of once specifically for each langSet. I hope it's clear.

Now that I've started using XSL more I took a very thick book from the library by a bearded guy ;) but it'll take quite a while to get from that book the knowledge that I need to do this kind of thins. In the meanwhile, thank you so much for your help!

I use processor Saxon 6.5.5.

====================This is the source data (very abridged):=====================

<?xml version="1.0" encoding="ISO-8859-1"?>
<dictionary>
   <author>TERMCAT, Centre de Terminologia</author>
   <title>TO Begudes</title>
   <records>
       <record num="1">
           <term lang="ca">absenta</term>
           <term lang="es">absenta</term>
           <term lang="es">ajenjo</term>
           <term lang="en">absinth</term>
           <term lang="en">absinthe</term>
       </record>
       <record num="2">
           <term lang="ca">acetificacis</term>
           <term lang="es">acetificacisn</term>
           <term lang="en">acetification</term>
       </record>
   </records>
</dictionary>

===============This is the result that I obtain (and should obtain): ==========================

<?xml version="1.0" encoding="UTF-8"?>
<martif type="TBX" xml:lang="en">
  <text>
     <body>
        <termEntry id="1">
           <langSet xml:lang="es">
              <term id="">absenta</term>
              <term id="">ajenjo</term>
           </langSet>
           <langSet xml:lang="en">
              <term id="">absinth</term>
              <term id="">absinthe</term>
           </langSet>
           <!-- (...) more langSets for any other languages -->
        </termEntry>
        <termEntry id="2">
           <langSet xml:lang="es">
              <term id="">acetificacisn</term>
           </langSet>
           <langSet xml:lang="en">
              <term id="">acetification</term>
           </langSet>
           <!-- (...) more langSets for any other languages -->
        </termEntry>
     </body>
  </text>
</martif>

================This is the stylesheet that I use:=========================

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy. -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<!--<xsl:output type="xml"/>-->
<xsl:template match="/">
<martif type="TBX" xml:lang="en">
<text>
<body>
<xsl:for-each select="dictionary/records/record">
<termEntry id="{@num}">
<xsl:if test="term[@lang='es']">
<langSet xml:lang="es">
<xsl:for-each select="term[@lang='es']">
<term id="">
<xsl:value-of select="current()" />
</term>
</xsl:for-each>
</langSet>
</xsl:if>
<xsl:if test="term[@lang='en']">
<langSet xml:lang="en">
<xsl:for-each select="term[@lang='en']">
<term id="">
<xsl:value-of select="current()" />
</term>
</xsl:for-each>
</langSet>
</xsl:if>
<!-- (...) the same for each language (e.g. ca) -->
</termEntry>
</xsl:for-each>
</body>
</text>
</martif>
</xsl:template>
</xsl:stylesheet>


Once again, thank you so much!
Kind regards,
--
Manuel Souto Pico


Current Thread
Keywords
xsl