Есть несколько трудностей с тем, чего вы пытаетесь достичь. Вычисление промежуточных итогов в данной точке на самом деле проще всего. Вам просто нужна предыдущая ось и сумма для ее вычисления:
sum(preceding::Value[../Code = 'A'])
Чтобы включить текущее значение, используйте оператор объединения следующим образом:
sum(Value[../Code = 'A'] | preceding::Value[../Code = 'A'])
Более сложная задача - показать разные таблицы «нижний колонтитул» на каждой странице. Заголовки и нижние колонтитулы автоматически повторяются на страницах, но содержимое одинаково для всех страниц, охватываемых таблицей. Единственное решение, которое я вижу, это разбить таблицу самостоятельно, добавляя каждый раз новый нижний колонтитул таблицы.
Безусловно, самый простой способ - просто взять фиксированное количество элементов данных за раз и отобразить их в отдельной таблице. Вы можете циклически проходить по типам A, B и C по одному для каждого, давая каждому значению отдельную строку. Таким образом, таблица всегда имеет одинаковое количество строк. Вы можете поэкспериментировать с числом, которое вы можете включить, чтобы определить, сколько помещается на одной странице.
Следующий код возвращает таблицу с первыми 10 значениями данных. Значения A, B и C расположены прямо друг под другом, но вы можете расположить их слева, в середине и вправо соответственно, если хотите. Внизу таблицы добавлены три строки с промежуточными итогами для A, B и C.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="global">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="global">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:table table-layout="fixed" width="150mm" border-style="solid">
<fo:table-column column-width="50mm"/>
<fo:table-column column-width="50mm"/>
<fo:table-column column-width="50mm"/>
<fo:table-body font-size="7pt">
<xsl:for-each select="/Root/Data[10 >= position()]">
<fo:table-row border-style="solid">
<fo:table-cell>
<fo:block height="12pt">
<xsl:value-of select="Code" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="Value" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</fo:table-row>
<xsl:if test="position() = last()">
<fo:table-row border-style="solid">
<fo:table-cell>
<fo:block height="12pt">Subtotal A</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="sum(preceding::Value[../Code = 'A'] | Value[../Code = 'A'])" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row border-style="solid">
<fo:table-cell>
<fo:block height="12pt">Subtotal B</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="sum(preceding::Value[../Code = 'B'] | Value[../Code = 'B'])" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row border-style="solid">
<fo:table-cell>
<fo:block height="12pt">Subtotal C</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="sum(preceding::Value[../Code = 'C'] | Value[../Code = 'C'])" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:if>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
Вам все еще нужно что-то определить, сколько таблиц из n элементов данных вам потребуется, а затем выполнить несколько рекурсивных вызовов, чтобы вывести их все. Надеюсь, на данный момент этого достаточно, чтобы вы снова пошли!
PS: я заметил, что вы используете префикс xfd. Похоже, вы работаете с XF Designer от Ecrion. Я не очень знаком с этим. Приведенный выше код представляет собой простое решение XSLT 1.0. Не уверен, что он работает в XF Designer, пожалуйста, дайте мне знать ..