L Duperval wrote:
1) How can I set a runtime variable depending on the value of SOMECODE? I tried:
<xsl:template match="DATAFILE">

<xsl:if test="@name='CODE1'">
  <xsl:message>
    <xsl:value-of select="@NAME" />
  </xsl:message>
  <xsl:variable name="filename" select="concat($outputDir,'/en/can.xml')" />
</xsl:if>
<xsl:if test="@name='CODE2'">
  <xsl:message>
    <xsl:value-of select="@NAME" />
  </xsl:message>
  <xsl:variable name="filename" select="concat($outputDir,'/en/int.xml')" />
</xsl:if>

<redirect:write select="$filename" indent="yes">
 .
 .
 .
</redirect:write>
</xsl:template match="DATAFILE">

When I run it though, I get an error saying the "filename" variable is
undefined, however the message prints on stdout.
A variable's scope in XSLT is only the containing block/element. Therefore if you define a variable in an <xsl:if>, it is only in scope with that <xsl:if> block, which is why it's telling you that $filename is undefined when you try to reference it outside of the <xsl:if>. If you need to compute a variable based on some conditions, you would put the conditions within the <xsl:variable> definition block.
2) I created a second XSL file where the only difference from above is that the
"/en/" in the filename is changed to "/fr/". Is there a way for me to combine
that in the same XSL file?
Your code could be put into a template with a parameter representing the language, and use the parameter to build your output directory, then call the template as many times as needed with the appropriate language parameter. Basic idea is to use a variable for this value, rather than rewriting the same code twice with only the path being different.
3) I have another pair of XSL documents which act in a similar manner, but where
the difference is that I rename attributes based on language. In one case, it
deletes all **_fr attributes and removes the "_en" suffix from the others. The
second files deletes all **_en attributes and removes the "_fr" from the other
attributes.

In an ideal world, I would like to create a single XSL which would generate all
my output in one fell swoop, instead of making me parse the same data multiple
times and sending it through different XSLs. But maybe I'm dreaming in
You can certainly set this up in a single XSLT using <xsl:apply templates> with appropriate @select and/or @mode values. You would then write templates that match what you want to process, pull out only the things you want, rename whatever you want, and redirect to the desired output file. Then it's just a question of applying those templates in the desired order.
Technicolor...

Thanks!

L


--
Nathan Nadeau
n...@gleim.com
Software Development
Gleim Publications, Inc.
http://www.gleim.com

Reply via email to