Больше ничего не зная о ваших входных данных (я понятия не имею, почему вы выбрали , чтобы не использовать настоящий XML ), мне придется немного догадаться:
<Budget>
<Table1>
<AllocID>1000</AllocID>
<AllocID>2000</AllocID>
<AllocID>3000</AllocID>
</Table1>
<Table2>
<AllocID>1000</AllocID>
<AllocID>2000</AllocID>
</Table2>
</Budget>
Самой простой является функция XPath sum()
вместе с правильным выражением XPath:
<!-- this will return 3000 for the above input -->
<xsl:template match="/" >
<xsl:value-of select="
sum(Budget/Table1/AllocID[. = //Budget/Table2/AllocID])
" />
</xsl:template>
Промежуточные суммы также можно рассчитать с помощью рекурсивной функции, например:
<!-- this will also return 3000 for the above input -->
<xsl:template match="/" >
<xsl:call-template name="total">
<xsl:with-param name="nodes" select="
Budget/Table1/AllocID[. = //Budget/Table2/AllocID]
" />
</xsl:call-template>
</xsl:template>
<xsl:template name="total">
<xsl:param name="nodes" />
<xsl:choose>
<!-- either there is something to calculate... -->
<xsl:when test="string(number($nodes[1])) != 'NaN'">
<xsl:variable name="subtotal">
<xsl:call-template name="total">
<xsl:with-param name="nodes" select="$nodes[position() > 1]" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="number($nodes[1]) + $subtotal" />
</xsl:when>
<!-- ...or we assume 0 -->
<xsl:otherwise>
<xsl:value-of select="0" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Это медленнее, но обеспечивает большую гибкость в процессе расчета. Вы можете заменить все нечисловые значения на 0, например. Или используйте разные значения данных узлов в соответствии с вашими правилами.