Re: [xsl] Sum in conjunction with string splitting?

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:

$expenses[substring(expense,1,7)='mileage']/expense

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



On 9/8/06, Steve <subsume@xxxxxxxxx> wrote:
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