Hi Chris, I was attempting to do something similar in the past week, and came across the following discussion on the issue. I found it helpful:
http://nick-dunn.co.uk/article/an-alternative-for-loop-using-xslt-and-template-callbacks/ Lloyd On Fri, Sep 10, 2010 at 12:53 PM, CRANFORD, CHRIS <[email protected] > wrote: > Not necessarily write it for me, just direction. I have been playing > with recursive template calls all morning, and thus far this is what > I have arrived at is the following: > > <!-- > This template matches against a planning record > entry in the plan for every part XML document. > --> > <xsl:template match="record"> > <xsl:call-template name="forLoopYear"> > <xsl:with-param name="start"> > <xsl:value-of select="$curYear"/> > </xsl:with-param> > <xsl:with-param name="end"> > <xsl:value-of select="$curYear+(-4)"/> > </xsl:with-param> > </xsl:call-template> > </xsl:template> > > <!-- > This template handles iterating over a start > and end year values stepping by 1 year. > --> > <xsl:template name="forLoopYear"> > <xsl:param name="start"/> > <xsl:param name="end" /> > > <xsl:if test="$start != $end"> > > <xsl:value-of select="$start"/><xsl:text> </xsl:text> > > <xsl:call-template name="forLoopMonth"> > <xsl:with-param name="month">1</xsl:with-param> > <xsl:with-param name="year"> > <xsl:value-of select="$start"/> > </xsl:with-param> > </xsl:call-template> > > <xsl:call-template name="forLoopYear"> > <xsl:with-param name="start"> > <xsl:value-of select="$start+1"/> > </xsl:with-param> > <xsl:with-param name="end"> > <xsl:value-of select="$end"/> > </xsl:with-param> > </xsl:call-template> > > </xsl:if> > </xsl:template> > > <!-- > This template handles iterating over months 1 > Through 12, looks up the data from the XML > Document and if it exists, displays it; > Otherwise outputs a 0 for the month/year. > --> > <xsl:template name="forLoopMonth"> > <xsl:param name="month"/> > <xsl:param name="year"/> > > <xsl:if test="$month <= 12"> > <xsl:for-each select="usage/details/detail"> > <xsl:if test="year = $year"> > <xsl:if test="month = $month"> > <xsl:value-of select="quantity"/><xsl:text> </xsl:text> > </xsl:if> > </xsl:if> > </xsl:for-each> > > <xsl:call-template name="forLoopMonth"> > <xsl:with-param name="month"> > <xsl:value-of select="$month+1"/> > </xsl:with-param> > <xsl:with-param name="year"> > <xsl:value-of select="$year"/> > </xsl:with-param> > </xsl:call-template> > > </xsl:if> > > </xsl:template> > > First, this a good approach or is there a better way? > > Secondly, how do I handle the scenario where I do not find the node > /usage/details/detail with the specified year/month to output a > standard 0 value? > > And I need to look at the original link on how to handle the sum > logic that I will need with this. > > > -----Original Message----- > > From: Eric Douglas [mailto:[email protected]] > > Sent: Friday, September 10, 2010 9:48 AM > > To: [email protected] > > Subject: RE: XSLT Help > > > > I was just confused then where you said your "XSLT starts with > > 2010...". > > You apparently meant to say your XSLT does nothing, but this is what > it > > needs to do. > > Are you looking for someone to write an entire XSL file for you, or > > what > > part are you struggling with? > > > > -----Original Message----- > > From: CRANFORD, CHRIS [mailto:[email protected]] > > Sent: Friday, September 10, 2010 10:42 AM > > To: [email protected] > > Subject: RE: XSLT Help > > > > No, all I was showing was the expected output. I still need to code > > the > > XSLT to actually generate that. > > > > > -----Original Message----- > > > From: Eric Douglas [mailto:[email protected]] > > > Sent: Friday, September 10, 2010 9:33 AM > > > To: [email protected] > > > Subject: RE: XSLT Help > > > > > > You already have the XSL to print the months and years and all you > > need > > > is the method to add up the data fields? > > > It sounds like you have the hard part done. > > > Look up the sum method. > > > http://www.w3schools.com/Xpath/xpath_functions.asp > > > > > > -----Original Message----- > > > From: CRANFORD, CHRIS [mailto:[email protected]] > > > Sent: Friday, September 10, 2010 10:23 AM > > > To: [email protected] > > > Subject: XSLT Help > > > > > > > > > I am struggling with the best way to parse the following XML section > > > from my document with XSLT using FOP. > > > > > > <document> > > > <usage> > > > <record> > > > <year>2010</year> > > > <month>1</month> > > > <quantity>1</quantity> > > > </record> > > > <record> > > > <year>2009</year> > > > <month>3</month> > > > <quantity>2</quantity> > > > </record> > > > </usage> > > > </document> > > > > > > In the PDF output, what I actually need to be able to produce is to > > > take the current year (2010) and go backward a total of > > > 4 years. The XML document could contain data in this section that > > > dates back prior to 2006 and that information is just not used in > > this > > > > > output. > > > > > > > > > The PDF should look like the following: > > > > > > J F M A M J J A S O N D Total > > > - - - - - - - - - - - - ----- > > > 2010 1 0 0 0 0 0 0 0 0 0 0 0 1 > > > 2009 0 0 2 0 0 0 0 0 0 0 0 0 2 > > > > > > The XSLT starts with 2010, searches for data for month 1 and steps > by > > 1 > > > until 12, keeping a total and then displays the yearly total, > > > decrements the year, resets the month to 1 and starts the process > > > over. > > > > > > During each step, I need to examine the XML document to find if data > > > exists for the year/month in /document/usage/record by those two > data > > > values and if not, default a 0 usage; otherwise read the value of > > > /quantity from the record. > > > > > > Anyone have any suggestions on the best way to do this? > > > > > > Chris > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [email protected] > > > For additional commands, e-mail: fop-users- > > [email protected] > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [email protected] > > > For additional commands, e-mail: fop-users- > > [email protected] > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] > > For additional commands, e-mail: [email protected] > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] > > For additional commands, e-mail: [email protected] > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
