[Home] [By Thread] [By Date] [Recent Entries]
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
|

Cart



