Это не работает как есть, потому что он пытается применить функцию substring
к набору узлов, когда ее нужно применить к строке (текстовое содержимое узла).
Я бы хотел, чтобы это было чтобы быть лучшим способом сделать это, но вот что я получил (XSLT 1.0):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
...
<xsl:template match="AmountDetails">
<xsl:variable name="x">
<xsl:for-each select="//PremiumAmount">
<item><xsl:value-of select="substring(., 2, 4)" /></item>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="sum(exsl:node-set($x)/item)" />
</xsl:template>
...
</xsl:stylesheet>
По сути, мы создаем переменную x, которая выглядит так:
<item>100</item>
<item>200</item>
<item>300</item>
...
И затем суммируем выражение $x/item
, которое выбирает все узлы элементов в x.