|
Subject: Re: [xsl] Re: RE: newbie: xsl:key and summation of substrings From: "Christopher Giblin" <CGI@xxxxxxxxxxxxxx> Date: Mon, 10 Dec 2001 11:40:12 +0100 |
Thanks, but your solution seems like home-brew - I prefer a portable
100% XLST solution.
Sorry if I misinterpret your recommendation.
Cheers, chris
Dimitre Novatchev
<dnovatchev@xxxxxxxxx> To: michael.h.kay@xxxxxxxxxxxx
Sent by: cc: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
owner-xsl-list@xxxxxxxxxxxx Subject: [xsl] Re: RE: newbie: xsl:key and summation of substrings
rytech.com
12/09/2001 09:34 PM
Please respond to xsl-list
> Here are three ways to sum over a computed quantity:
>
> * Create a result tree fragment containing nodes whose value is the
computed
> number, and use sum(xx:node-set($rtf//value)) to do the summation, where
> xx:node-set() is your vendor's extension function for converting an RTF
to a
> node-set
>
> * Use a recursive named template [this is the only standard XSLT 1.0
> solution]
>
> * Use the saxon extension function saxon:sum($nodes, saxon:expression
(...))
> > I want to sum the "freespace", but sum(//disk/freespace)
> > won't work because
> > freespace is not a number due to the trailing "MB".
The first of the above solutions requires inappropriate amount of memory
and time.
The third ties us to a proprietary (although one of the best) XSLT
processor.
The second is too-general, as one can achieve almost anything in XSLT with
recursion. It would be almost equivalent to say: "Use arithmetic rules".
Here's another, more practical way, since it uses a "library function" --
transformAndSum:
http://sources.redhat.com/ml/xsl-list/2001-11/msg00831.html
This is ***the*** general solution for all such problems belonging to this
"transform and sum" class of problems...
Having such a general solution available in pure XSLT shows that any
"dynamic
module" effort is very limited and therefore not applicable (== of any use)
in the
general cases.
Re-Using the ready-made "transform and sum" function described in the above
link
gives us the following:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:func-transform="f:func-transform"
exclude-result-prefixes="xsl func-transform"
>
<xsl:import href="transform-and-sum.xsl"/>
<xsl:output method="text"/>
<func-transform:func-transform/>
<xsl:template match="/">
<xsl:call-template name="transform-and-sum">
<xsl:with-param name="pFuncTransform"
select="document('')/*/func-transform:*[1]"/>
<xsl:with-param name="pList" select="//freespace"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="func-transform:*">
<xsl:param name="arg" select="0"/>
<xsl:value-of select="substring-before($arg, ' ')"/>
</xsl:template>
</xsl:stylesheet>
When this transformation is applied on the following (your) source xml:
<disks>
<disk>
<freespace>1235 MB</freespace>
</disk>
<disk>
<freespace>40 MB</freespace>
</disk>
<disk>
<freespace>75 MB</freespace>
</disk>
</disks>
The result is:
1350
Hope this helped.
Cheers,
Dimitre Novatchev.
__________________________________________________
Do You Yahoo!?
Send your FREE holiday greetings online!
http://greetings.yahoo.com
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 -> |
|---|---|---|
| [xsl] Re: RE: newbie: xsl:key and s, Dimitre Novatchev | Thread | Re: [xsl] Re: RE: newbie: xsl:key a, David Carlisle |
| Re: [xsl] Distinct problem, Trevor Nash | Date | Re: [xsl] newbie: xsl:key and summa, Christopher Giblin |
| Month |