Subject: Re: [xsl] Sum in conjunction with string splitting? From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> Date: Fri, 8 Sep 2006 13:39:15 -0700 |
I don't see your complete stylesheet so it can only be noticed that the expression:
is very unlikely to be what you really want to express as the node-set to be passed as argument.
This will select all "expense" children if the first "expense" child happens to start with "mileage".
The problem could be that the $expenses variable doesn't contain what you think it should.
Also, I am not sure you have specified a template reference node -- at least it is not in the code, shown in your message.
-- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk
Dimitre,
Incredibly helpful .txt file on the issue, but I seem to be misapplying it. Do you see any obvious errors?
I don't get the underlying logic, so it could be that my use of $expense instead of a source doc is my problem. Less likely is the fact that I'm using fxsl-MS.
<xsl:call-template name="transform-and-sum"> <xsl:with-param name="pFuncTransform" select="document('')/*/func-transform:*[1]"/> <xsl:with-param name="pList" select="$expenses[substring(expense,1,7)='mileage']/expense"/> </xsl:call-template>
<xsl:template match="func-transform:*"> <xsl:param name="arg" select="0"/> <xsl:value-of select="$arg" /> <!-- This isn't printing anything --> <xsl:value-of select="substring-after($arg, 'mileage')"/> </xsl:template>
$expense does indeed contain something like:
<Expenses> <expense>mileage 50</expense> <expense>mileage 20</expense> <expense>mileage 30</expense> </Expense>
On 9/8/06, Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote: > On 9/8/06, Steve <subsume@xxxxxxxxx> wrote: > > Posted yesterday, but I isolated the problem significantly =) > > > > The snippet below attempts to split the string 'mileage 6' into > > [mileage] and [6] and then store it in $miles (for example). > > > > I am trying to get the SUM of the resulting SPLIT of the nodes that > > match 'mileage'. > > > > I am close. Right now I only get one node, not the sum of all matches. > > > > <xsl:variable name="miles"> > > <xsl:call-template name="str-split-to-words"> > > <xsl:with-param name="pStr" > > select="msxsl:node-set($expenses[substring(expense,1,7)='mileage']/expense)" > > /> > > <xsl:with-param name="pDelimiters" select="' '" /> > > <!-- splitting expense at blank spaces --> > > </xsl:call-template> > > </xsl:variable> > > <xsl:value-of select="msxsl:node-set($miles)/*[2]" /><br /> > > > > ==== > > > > $expenses example: > > > > <Expenses> > > <expense>Mileage 6</expense> > > <expense>cheese</expense> (wouldn't match) > > <expense>Mileage 10</expense> > > </Expenses> > > > > ==== > > > > Desired value of $miles: 16. > > With FXSL2.0 one would simply write: > > sum(f:map(f:compose(f:decimal(), > f:flip(f:substring-after(),' ') > ), > /*/*[contains(.,' ')] > ) > ) > > > Or simply use the f:transform-and-sum() function: > > f:transform-and-sum(f:flip(f:substring-after(),' '), > /*/*[contains(.,' ')] > ) > > > In XSLT 1.0, one can use the "transform-and-sum" template of FXSL 1.x > > > -- > Cheers, > Dimitre Novatchev > --------------------------------------- > Truly great madness cannot be achieved without significant intelligence. > --------------------------------------- > To invent, you need a good imagination and a pile of junk > > > > > > > Thanks a bunch, > > > > -Steve
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Sum in conjunction with s, Steve | Thread | Re: [xsl] Sum in conjunction with s, Steve |
[xsl] Incorrectly working libxslt f, Max | Date | [xsl] xtvd grouping problem (I thin, Bob Portnell |
Month |