Solved

Calculate a Total in XML

Posted on 2011-02-18
5
680 Views
Last Modified: 2012-05-11
Trying to calculate a total Item weight. I have very little experience in xml and I thought this is what I would need.

<xsl:for-each select="//Order/Item" > 
    <xsl:variable name="tw" select='$tw + <xsl:value-of select = "/Weight"/>' />
</xsl:for-each>

but it is not valid.
or something like this

<xsl:for-each select="//Order/Item" > 
    <xsl:variable name="tw" select='$tw + /Weight' />
</xsl:for-each>
0
Comment
Question by:frtools
  • 2
  • 2
5 Comments
 
LVL 9

Expert Comment

by:suvmitra
ID: 34927803
Why not use your data table (sql, access etc.) to do the calculation and then return the data set and write xml?
0
 
LVL 9

Assisted Solution

by:suvmitra
suvmitra earned 200 total points
ID: 34927831
1. sum(/Students/Student//Marks)
Will sum the marks for all Students, or if you're looping through all Students

2. sum(//Marks)

(assuming that the XPath is operating from within a loop of Students).
0
 
LVL 60

Accepted Solution

by:
Geert Bormans earned 300 total points
ID: 34931771
First some background on your first attempt
<xsl:for-each select="//Order/Item" >
    <xsl:variable name="tw" select='$tw + <xsl:value-of select = "/Weight"/>' />
</xsl:for-each>

Note that variables in XSLT don't vary (they are more like constants)
Variables in XSLT get a value assigned when they are created
It makes variables useless for calculating sums as you are doing here

You have however full acces to the full XML tree using XPath.
What you need to do for a simple sum is just list the nodes you want to sum in the sum function
You could simply rewrite the above as

<xsl:variable name="tw" select="sum(//Order/Item/Weight)"/>

now $tw contains your sum and you can use it

<xsl:value-of select="$tw"/>

For complex sums (sums from calculated values such as sub-totals)
you can use recursion, which is a comon technique in XSLT to work around constant variables

This might get complex, and at some point you could indeed think about solving the totalling earlier in the chain
(eg. in the database export allready)
But you need to know that a lot of complex totalling in XSLT is possible if you don't have access to the XML creation process

There is a little bug in 2. of suvmitra's second comment
sum(//Marks)
sums all Marks in the document, starting from the root, not from the Students level when you are in context of a student
if you need to be selective in your context (Students), you will need this
sum(.//Marks)
0
 

Author Closing Comment

by:frtools
ID: 34933265
I gave gertone more points because the solution had a better explanation that led me to the right solution.
0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 34933273
welcome
0

Featured Post

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Which XML parser should I used for my requirement 11 70
Removing information on Duplicate XML Nodes 24 77
XML Parsing Classic ASP 5 56
Formatting issues in XSL FO 3 37
Introduction In my previous article (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/A_9150-Loading-XML-Using-SSIS.html) I showed you how the XML Source component can be used to load XML files into a SQL Server database, us…
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…

813 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now