[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: XSL Variable not getting set

Subject: Re: XSL Variable not getting set
From: Abel Braaksma <abel.online@xxxxxxxxx>
Date: Wed, 14 Mar 2007 16:53:28 +0100
Re:  XSL Variable not getting set
George Cristian Bina wrote:

<xsl:template match="niku:QueryResult/niku:Records">
<xsl:for-each-group select="niku:Record"
group-by="concat(@fiscalyear,@gl)">
<xsl:variable name="cg" select="current-group()"/>
<xsl:if test="@fiscalyear != 'null'">
<xsl:value-of select="@fiscalyear"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="@gl"/>
<xsl:text>,</xsl:text>
<xsl:for-each select="1 to 12">
<xsl:variable name="p" select="."/>
<xsl:value-of select="if ($cg[@month=$p]) then $cg[@month=$p]/@cost else 0"/>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
</xsl:if> </xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>

Note that the xsl:if is placed differently from the OP, outputting no line at all when @fiscalyear = null, whereas the original output an empty string instead (leaving the comma).


Because all we are dealing with are sequences, you can downsize the example of George even further, removing any addition if-statements altogether. Here's a go:

<xsl:template match="niku:Records">
   <xsl:for-each-group select="niku:Record"
       group-by="concat(@fiscalyear,@gl)">

       <xsl:value-of select="
           (@fiscalyear[.!='null'], '')[1],
           (@gl[.!='null'], '')[1],
           for $i in 1 to 12
           return (current-group()[@month=$i]/@cost, 0)[1]"
           separator="," />

   </xsl:for-each-group>
</xsl:template>


If you don't like the constructs of the type (@fiscalyear[.!='null'], '')[1] you can replace them with the if-equivalents, of course. Also, it will add to readability with the aforementioned micro pipeline, which will make the same template look like this:


<xsl:template match="niku:Records">
   <xsl:for-each-group select="niku:Record"
       group-by="concat(@fiscalyear,@gl)">

       <xsl:value-of select="
           (@fiscalyear, @gl),
           for $i in 1 to 12
           return (current-group()[@month=$i]/@cost, 0)[1]"
           separator="," />

   </xsl:for-each-group>
</xsl:template>


It's almost as with Perl: there's more than one way to do it ;)


Cheers,
-- Abel Braaksma
  http://www.nuntia.nl

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.