<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(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com]On Behalf Of
poppe chris
Sent: Wednesday, February 04, 2004 3:56 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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