Это преобразование XSLT 1.0 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:call-template name="sumWeighted"/>
</xsl:template>
<xsl:template name="sumWeighted">
<xsl:param name="pList" select="*"/>
<xsl:param name="pIndex" select="1"/>
<xsl:param name="pAccum" select="0"/>
<xsl:choose>
<xsl:when test="$pIndex > count($pList)">
<xsl:value-of select="$pAccum"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="sumWeighted">
<xsl:with-param name="pList" select="$pList"/>
<xsl:with-param name="pIndex"
select="$pIndex+1"/>
<xsl:with-param name="pAccum"
select="$pAccum+$pList[$pIndex]*$pIndex"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
применительно к предоставленным документам XML :
<t>
<a>0</a>
<b>1</b>
<c>0</c>
<d>1</d>
</t>
<t>
<a>1</a>
<b>1</b>
<c>0</c>
<d>0</d>
</t>
и
<t>
<a>0</a>
<b>1</b>
<c>1</c>
<d>1</d>
</t>
дает желаемые результаты соответственно :
6
3
9
Ссылка
Если вы хотите испачкать руки сложными математическими вычислениями с использованием XSLT, посмотрите это:
http://fxsl.sourceforge.net/articles/xslCalculator/The%20FXSL%20Calculator.html
XPath 2.0 / XSLT 2.0 Solution :
Используйте только одну строку XPath 2.0:
sum(/*/*/(number()*position()))