Идея решения этой проблемы:
- Сохранение необходимых элементов в переменной.
- Запустите цикл
for-each
, извлекая содержимое из этой переменной. - Суммируйте цены также из этой переменной.
Небольшое усложнение заключается в том, что в XSLT 1.0 тип этой переменной равен Фрагмент дерева результатов (RTF) , поэтому он не можетбыть непосредственно использованным в XPath выражениях.
Чтобы обойти это ограничение, вы должны использовать функцию exsl:node-set
, конвертируя такие RTF в набор узлов и затем используйте его в XPath .
Таким образом, весь скрипт может выглядеть следующим образом:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="text"/>
<xsl:param name="Num" select="2"/>
<xsl:template match="/">
<xsl:variable name="discs">
<xsl:for-each select="audioteka/CD">
<xsl:sort select="author" order="descending"/>
<xsl:if test="position() <= $Num">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:text>Zamowienie - faktura

</xsl:text>
<xsl:for-each select="exsl:node-set($discs)/CD">
<xsl:value-of select="concat('Tytul: ', title, '
')"/>
<xsl:value-of select="concat('Autor: ', author, '
')"/>
<xsl:value-of select="concat('Gatunek: ', genre, '
')"/>
<xsl:value-of select="concat('Cena: ', price, '
')"/>
<xsl:text>----------------------------------
</xsl:text>
</xsl:for-each>
<xsl:value-of select="concat('Suma: ', sum($discs/CD/price),
'
')"/>
</xsl:template>
</xsl:stylesheet>
Как вы можете видеть, я также внес некоторые исправления, касающиеся генерации вывода.
Первое, на что нужно обратить внимание, это метод вывода = text , потому что вы генерируете «обычный» текст, а не XML.
Еще одно изменение заключается в том, что для вывода текста Iиспользуйте xsl:text
и 

для перевода строки.Преимущество состоит в том, что отступ кода (и текста) в скрипте не влияет на отступ вывода.
Рабочий пример см. http://xsltransform.net/3MP2uBx