Subject: RE: [xsl] recursive addition From: "Josh Canfield" <josh.canfield@xxxxxxxxxxxx> Date: Wed, 14 Jan 2004 17:08:18 -0800 |
It sounds to me like what you want is this: Given dir1 you want to add 4 from the files attribute of folder[@id='dir1'] , plus 3 from the files attribute from folder[@id='dir2'], plus the 6 from the files attribute of folder[@id='dir3'] for a total of 13. I believe the following xslt should fit your needs. It could probably be simplified, but I was just banging it out... I've learned to love <xsl:message> while writing this, excellent for dumping out what's going on... Josh <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" xmlns:xalan="http://xml.apache.org/xslt" xalan:indent-amount="2"/> <xsl:template match="/root"> <!-- the id of the folder to count --> <xsl:variable name="dir-id" select="'dir1'"/> <xsl:variable name="count"> <xsl:call-template name="count-files"> <xsl:with-param name="dir" select="/root/folder[@id=$dir-id]"/> </xsl:call-template> </xsl:variable> There are <xsl:value-of select="$count"/> files under <xsl:value-of select="$dir"/>. </xsl:template> <xsl:template name="count-files"> <xsl:param name="dir"/> <!-- count the files in this dir --> <xsl:variable name="counter"> <xsl:choose> <xsl:when test="$dir/file[@id]"> <xsl:call-template name="count-subfiles"> <xsl:with-param name="file" select="$dir/file[@id][1]"/> </xsl:call-template> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:value-of select="$dir/@files + $counter"/> </xsl:template> <xsl:template name="count-subfiles"> <xsl:param name="file"/> <!-- count the files in the related dir --> <xsl:variable name="x"> <xsl:call-template name="count-files"> <xsl:with-param name="dir" select="/root/folder[@id=$file/@id]"/> </xsl:call-template> </xsl:variable> <!-- count the files in the following-sibling files with dir ids--> <xsl:variable name="y"> <xsl:choose> <xsl:when test="$file/following-sibling::file[@id]"> <xsl:call-template name="count-subfiles"> <xsl:with-param name="file" select="$file/following-sibling::file[@id][1]"/> </xsl:call-template> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:value-of select="$x + $y"/> </xsl:template> </xsl:stylesheet> -----Original Message----- From: annirack@xxxxxxx [mailto:annirack@xxxxxxx] Sent: Wednesday, January 14, 2004 2:42 PM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: [xsl] recursive addition > One question -- what does the attribute @files mean on > the folder element whose @id="dir1"? It has @files="4", > but that doesn't seem to enter into the calculation you're > doing. So the semantics of the XML are a little unclear to me. Sorry, I guess the example was a little unclear. I want to sum the files attribute for *all* folders under the initial parent. So the result I'd want from dir0 would be 25. The sum of the file attributes of all the folder elements is 27. Is that a little clearer? > To rephrase the above question, are you just summing the attributes > of leaf folders (as you appear to be in your example where you > expect the answer to be 9)? All branches and leaves, but not the trunk. (where an arbitrary starting point is the trunk) > > Here's an example: > > <root> > > <folder files="2" id="dir0"> > > <file id="dir1" /> > > > > <file id="dir4" /> > > </folder> > > > > <folder files="4" id="dir1"> > > <file id="dir2" /> > > > > <file id="dir3" /> > > </folder> > > > > <folder files="3" id="dir2" /> > > > > <folder files="6" id="dir3" /> > > > > <folder files="7" id="dir4" /> > > > > <folder files="5" id="dir5" /> > > </root> > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] recursive addition, Wendell Piez | Thread | [xsl] splitting a string at ,, Archana Rao |
Re: [xsl] Why <br /> in XSLT Styles, annirack | Date | RE: [xsl] Why <br /> in XSLT Styles, cknell |
Month |