Here's a solution using XSLT2, in which node-sets are first-class objects. In XSLT1 you'd need to use a node-set extension.
Explanation below:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="extendedItems" as="xs:integer*">
<xsl:for-each select="//Item">
<xsl:value-of select="./Price * ./Quantity"/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="total">
<xsl:value-of select="sum($extendedItems)"/>
</xsl:variable>
<xsl:template match="//QuantityTotal">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$total"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
The approach here is to use an "Identity transform" to copy the document, while performing the calculations and inserting the result into the output QuantityTotal template. The first template copies the input to the output but is overridden by a more-specific template for QuantityTotal at the bottom. The first variable declaration creates a list of extended costs, and the second variable definition sums the costs to produce the total. The total is then inserted into the QuantityTotal node.
The key to understanding XSL is that it is declarative in nature. The most common conceptual error made by almost all beginners is to assume that the stylesheet is a sequential program that processes the input XML document. In reality it's the other way around. The XSL engine reads the XML document. and for each new tag it encounters it looks in the stylesheet for the "best" match, executing that template.
EDIT:
Here's an xslt1.1 version that works with Saxon 6.5
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ex="http://exslt.org/common"
extension-element-prefixes="ex"
version="1.1">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="extendedItems">
<xsl:for-each select="//Item">
<extended>
<xsl:value-of select="./Price * ./Quantity"/>
</extended>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="total">
<xsl:value-of select="sum(ex:node-set($extendedItems/extended))"/>
</xsl:variable>
<xsl:template match="//QuantityTotal">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$total"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>