[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
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):=====================
===============This is the result that I obtain (and should obtain): ==========================
================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>
[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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] cdata, David Carlisle | Thread | Re: [xsl] how to recycle code to pr, David Carlisle |
Re: [xsl] cdata, David Carlisle | Date | Re: [xsl] how to recycle code to pr, David Carlisle |
Month |
Keywords