Subject: RE: [xsl] sum From: "Josh Canfield" <Josh.Canfield@xxxxxxxxxxxx> Date: Wed, 4 Feb 2004 11:25:56 -0800 |
> <xsl:template name="substream8" match="m:SUBSTR8"> > <xsl:value-of > select="sum(number((substring-after(normalize-space(./m:SUBSTREAM/m:SUBSTREAM_interior),' > '))))"/> > </xsl:template> The XPath sum function takes a nodeset, and not a number. See http://www.w3.org/TR/xpath#function-sum Accessing the first GOP_BYTE can be done by using the [1] predicate, which is equivalent to [position() = 1]. Determining the path to the GOP_SIZE element that contains the GOP_BYTE elements depends on your context, so I made your XML valid by wrapping it in a <doc> element, and terminating the <SUBSTR8> element. This XSLT uses two methods to get your result, one using exst:node-set and the other using a recursive template. Enjoy, Josh <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/doc"> <xsl:variable name="rtf"> <xsl:for-each select="SUBSTR8/SUBSTREAM/SUBSTREAM_interior"> <x><xsl:value-of select="substring-after(.,' ')"/></x> </xsl:for-each> </xsl:variable> <xsl:variable name="sum-by-nodeset" select="sum(exslt:node-set($rtf)/x)"/> <xsl:variable name="sum-by-template"> <xsl:call-template name="sum-SUBSTREAM_interior"> <xsl:with-param name="the-substream" select="SUBSTR8/SUBSTREAM[1]"/> </xsl:call-template> </xsl:variable> <doc> <sum-by-nodeset> <xsl:value-of select="GOPSIZE/GOP_BYTE[1]"/> - <xsl:value-of select="$sum-by-nodeset"/> = <xsl:value-of select="GOPSIZE/GOP_BYTE[1] - $sum-by-nodeset"/> </sum-by-nodeset> <sum-by-template> <xsl:value-of select="GOPSIZE/GOP_BYTE[1]"/> - <xsl:value-of select="$sum-by-template"/> = <xsl:value-of select="GOPSIZE/GOP_BYTE[1] - $sum-by-template"/> </sum-by-template> </doc> </xsl:template> <xsl:template name="sum-SUBSTREAM_interior"> <xsl:param name="value" select="0"/> <xsl:param name="the-substream"/> <xsl:variable name="the-sum"> <xsl:choose> <xsl:when test="$the-substream/following-sibling::SUBSTREAM"> <xsl:call-template name="sum-SUBSTREAM_interior"> <xsl:with-param name="value" select="number(substring-after($the-substream/SUBSTREAM_interior,' '))"/> <xsl:with-param name="the-substream" select="$the-substream/following-sibling::SUBSTREAM[1]"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="number(substring-after($the-substream/SUBSTREAM_interior,' '))"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:value-of select="$the-sum + $value"/> </xsl:template> </xsl:stylesheet> -----Original Message----- From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of poppe chris Sent: Wednesday, February 04, 2004 3:56 AM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: [xsl] sum Hello, i have the following question, Im dealing with the following xmlfile (only showing parts of it) <GOPSIZE> <GOP_BYTE>721619968</GOP_BYTE> <GOP_BYTE>35392768</GOP_BYTE> <GOP_BYTE>3214937088</GOP_BYTE> <GOP_BYTE>2174815232</GOP_BYTE> <GOP_BYTE>2650147328</GOP_BYTE> <GOP_BYTE>1301153792</GOP_BYTE> <GOP_BYTE>1162808064</GOP_BYTE> </GOPSIZE> <SUBSTR8> <SUBSTREAM> <lengthbit>0</lengthbit> <stuff>5</stuff> <two>167</two> <SUBSTREAM_interior>477407 1447</SUBSTREAM_interior> </SUBSTREAM> <SUBSTREAM> <lengthbit>0</lengthbit> <stuff>18</stuff> <two>83</two> <SUBSTREAM_interior>478856 4691</SUBSTREAM_interior> </SUBSTREAM> <SUBSTREAM> <lengthbit>0</lengthbit> <stuff>58</stuff> <two>46</two> <SUBSTREAM_interior>483549 14894</SUBSTREAM_interior> </SUBSTREAM> <SUBSTREAM> <lengthbit>1</lengthbit> <stuff>0</stuff> <four>60422</four> <SUBSTREAM_interior>498447 60422</SUBSTREAM_interior> </SUBSTREAM> <SUBSTREAM> <lengthbit>1</lengthbit> <stuff>0</stuff> <four>233080</four> <SUBSTREAM_interior>558873 233080</SUBSTREAM_interior> </SUBSTREAM> what i would like to do is take the sum of all the rightparts of the <SUBSTREAM_interior> elements and substract this from the first <GOP_BYTE> element. 2 problems arise here, first of all, how can i take a sum of those elements? I use number((substring-after(normalize-space(m:SUBSTREAM_interior),' '))) to reach the right part of the <SUBSTREAM_interior> but something like <xsl:template name="substream8" match="m:SUBSTR8"> <xsl:value-of select="sum(number((substring-after(normalize-space(./m:SUBSTREAM/m:SUBSTREAM_interior),' '))))"/> </xsl:template> doesnt work, and secondly when i got the sum how can i substract it from a <GOP_BYTE>element wich is standing higher in the xmlfile then the <SUBSTR8> ? I hope someone can help me out here, greetings Chris _________________________________________________________________ Geschenkideeën en e-cards voor Valentijn ! http://www.msn.be/valentijn 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: sum, Dimitre Novatchev | Thread | [no subject], David Carlisle |
Re: [xsl] Node Order and Value dete, scott gabelhart | Date | Re: [xsl] Printing xml to paper and, Johnson, Kaerstin |
Month |