xsl-list
[Top] [All Lists]

RE: sum

2004-02-04 12:25:56
 <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



<Prev in Thread] Current Thread [Next in Thread>
  • sum, poppe chris
    • RE: sum, Josh Canfield <=