Язык вашего первого абзаца очень процедурный ("Я хочу поставить ... сравнить ... посмотреть ... поставить ... показать"). Это не очень хороший подход к функциональному программированию, потому что это задача обратного инжиниринга.
Ваш последний абзац - это тот язык, который вы должны использовать для описания требований: «Это сравнение между суммой X и суммой Y». К сожалению, это не совсем точно, как заявление о требованиях. И вы не показываете желаемый результат.
Таким образом, наш единственный способ решить, чего вы хотите достичь, это попытаться угадать, что вы хотели с помощью своего неполного и нерабочего кода.
Единственное, что мы можем сказать наверняка, это то, что подход, который вы используете, не будет работать. Вы не можете изменить значение переменной в цикле (фактически, циклов нет, только функции отображения).
Похоже, вы используете XSLT 1.0, что на самом деле делает подобные вычисления довольно сложными. Функция sum()
в XSLT 1.0 работает только с наборами узлов, а не с наборами вычисляемых чисел, что вам и нужно. Если вы сможете перейти на XSLT 2.0 (или 3.0), это облегчит вашу жизнь.
Типичный способ суммирования вычисленных значений в XSLT 1.0 - с помощью рекурсии: вам нужно написать именованный шаблон, который вызывается для обработки одного значения, который затем вызывает себя для обработки следующего значения, передавая "результат так далеко", как параметр, и возвращая окончательный результат, когда вы доберетесь до последней вещи на входе.
Рекурсия в функциональном программировании является эквивалентом зацикливания в процедурных языках. Наличие мощных операторов для работы с наборами значений означает, что вам часто не требуется явная рекурсия, но функции и операторы в 1.0 часто недостаточно мощны.