Subject: Re: String-length From: Phil Lanch <phil@xxxxxxxxxxxxxxx> Date: Mon, 13 Dec 1999 19:09:17 +0000 |
Alternatively, use a named template to collect (nodes containing) the numbers you want to add up in a variable, and apply the sum() function to them. The tricky bit is that the variable contains a result-tree fragment, not a node list, and the sum() function must be given a node-list, so you need to convert the result-tree fragment to a node-list using a node-set() extension function. This is available in Saxon or XT (and it looks such a good idea that surely all good XSL processors will have it eventually). This kind of use of apply-templates or call-template inside a variable is often an alternative to recursive named templates. So in Saxon that would be: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sxf="/com.icl.saxon.functions.Extensions" version="1.0"> <xsl:template match="para"> <xsl:variable name="lengths"> <xsl:apply-templates select="preceding-sibling::para|." mode="length"/> </xsl:variable> This para contains: <xsl:value-of select="string-length()"/> Total from para number 1 to <xsl:value-of select="position()"/>: <xsl:value-of select="sum(sxf:node-set($lengths)/length)"/> </xsl:template> <xsl:template match="para" mode="length"> <length><xsl:value-of select="string-length()"/></length> </xsl:template> and in XT you need to declare the xmlns:xt="http://www.jclark.com/xt" namespace and change sxf:node-set to xt:node-set. Kay Michael wrote: > > You need another of those recursive named templates that does, in effect > strlength($nodeset) = string-length($nodeset[1]) + > strlength($nodeset[position()>1]) > > Of course writing this in XSL is about 15 lines of code. There are many > examples of this pattern in the archives of this list. > > Mike Kay > > > -----Original Message----- > > From: Thomas Karlsen [mailto:ThomasK@xxxxxxxxxxxxxxx] > > Sent: 13 December 1999 11:22 > > To: 'XSL-List@xxxxxxxxxxxxxxxx' > > Subject: String-length > > > > > > Im trying to hold track over how many char. i'm sending to the output. > > > > xml: > > <section> > > <para>this is a test</para> > > <para>this is a test</para> > > <para>this is a test</para> > > <para>this is a test</para> > > </section> > > > > xsl: > > <template match="section"> > > <apply-templates /> > > </template> > > > > <template match="para"> > > This para contains: <xsl:value-of select="string-length()"/> > > Total from para number 1 to <xsl:value-of select="position()"/>: > > <xsl:value-of select="string-length(preceding-sibling::para)"/> > > <apply-templates /> > > </template> > > > > My question is how can I add the string-values for the para's that is > > already traversed? > > The preceding-sibling function only gives me the value of the > > first para in > > the node-set. -- cheers phil "that monotonous state of the soul halfway between fulfillment and futility which comes with life in the country" --- Musil XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: String-length, Kay Michael | Thread | RE: String-length, Thomas Karlsen |
Re: Unparsed Entity and XSL, Rick Geimer | Date | XSL embedded Script Questions., Jia Ming Li |
Month |