|
Subject: Re: [xsl] How do I get a SUM of the string-length of all child nodes ?? From: Dimitre Novatchev <dnovatchev@xxxxxxxxx> Date: Sun, 29 May 2005 11:48:17 +1000 |
Assuming we want to get the sum of string-lengths of all child nodes
of the top node,
using FXSL one would write:
sum(f:map(f:string-length(), /*/node()))
Here's a complete transformation:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f xs"
>
<xsl:import href="../f/func-map.xsl"/>
<xsl:import href="../f/func-Operators.xsl"/>
<xsl:import href="../f/func-standardXpathFunctions.xsl"/>
<!--
This transformation must be applied to:
../data/numList.xml
Expected result: 20
-->
<xsl:strip-space elements="*"/>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:value-of select="sum(f:map(f:string-length(), /*/node()))"/>
</xsl:template>
</xsl:stylesheet>
When applied for example on this source.xml file:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
the wanted result is produced:
20
One can use also the transform-and-sum template (FXSL for XSLT 1.0) or
the f:transform-and-sum() function (FXSL for XSLT 2.0). In the last
case the necessary XPath expression is:
f:transform-and-sum(f:string-length(), /*/*)
and the complete transformation:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f"
>
<xsl:import href="../f/func-transform-and-sum.xsl"/>
<xsl:import href="../f/func-standardXpathFunctions.xsl"/>
<!-- to be applied on numList.xml -->
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select=
"f:transform-and-sum(f:string-length(), /*/*)"/>
</xsl:template>
</xsl:stylesheet>
Cheers,
Dimitre Novatchev.
On 5/27/05, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> In XSLT 1.0 the sum() function can only sum the string values of nodes, it
> can't sum a set of computed numbers. This means your options are
>
> (a) a two-phase transformation: first create a tree in which the computed
> numbers are represented as attributes (typically), then sum over these
> attributes
>
> (b) a recursive template to compute the sum
>
> In 2.0, like many things, it's much easier:
>
> sum(child::node()/string-length())
>
> Michael Kay
> http://www.saxonica.com/
>
>
> > -----Original Message-----
> > From: Bovy, Stephen J [mailto:STEPHEN.Bovy@xxxxxx]
> > Sent: 27 May 2005 07:36
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] How do I get a SUM of the string-length of all
> > child nodes ??
> >
> > I am not sure how to do this:
> >
> > here is what I have which is obviously incorrect:
> >
> > <xsl:template match="/*/*/*" >
> > <xsl:param name="rcnt" />
> > <xsl:choose>
> > <xsl:when test="position()=1">
> > <xsl:variable name="csum" select="sum(string-length(.))"/>
> > rsizes <xsl:value-of select="$rcnt"/> =<xsl:value-of select="$csum"/>;
> > </xsl:when>
> > <xsl:otherwise>
> > bt('<td align="center"> ');
> > bt('<xsl:value-of select="."/> ');
> > bt('</td> ');
> > </xsl:otherwise>
> > </xsl:choose>
> > </xsl:template>
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] How do I get a SUM of the, Michael Kay | Thread | Re: [xsl] How do I get a SUM of the, Mukul Gandhi |
| Re: [xsl] How do I get a SUM of the, David Carlisle | Date | Re: [xsl] How do I get a SUM of the, Mukul Gandhi |
| Month |