【发布时间】:2022-01-11 22:49:21
【问题描述】:
源 XML:
<Root>
<Data>
<Value>10</Value>
</Data>
<Data>
<Value>10</Value>
</Data>
<Data>
<Value>15</Value>
</Data>
<Data>
<Value>2</Value>
</Data>
<Data>
<Value>32</Value>
</Data>
<Data>
<Value>5</Value>
</Data>
<Data>
<Value>40</Value>
</Data>
<Data>
<Value>18</Value>
</Data>
<Data>
<Value>50</Value>
</Data>
<Data>
<Value>1</Value>
</Data>
<Data>
<Value>43</Value>
</Data>
<Data>
<Value>5</Value>
</Data>
<Data>
<Value>21</Value>
</Data>
<Data>
<Value>87</Value>
</Data>
<Data>
<Value>8</Value>
</Data>
....
</Root>
XSL-FO 代码: 我的代码包含一个表格行和一个表格页脚
<fo:table>
<fo:table-column column-width="50mm"/>
<fo:table-column column-width="50mm"/>
<fo:table-footer>
<fo:table-row>
<fo:table-cell>
<fo:block>Subtotal: </fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<fo:retrieve-table-marker retrieve-class-name="Subtotal" retrieve-position-within-table="last-starting"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-footer>
<fo:table-body>
<xsl:for-each select="/Root/Data">
<fo:table-row>
<fo:table-cell>
<fo:block>Value:</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="Value"/>
<fo:marker marker-class-name="Subtotal">
<xsl:variable name="position" select="position()"/>
<xsl:value-of xpath="sum(../Data[position() <= $position]/Value)"/>
</fo:marker>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
我正在从上表生成 PDF 输出。在 PDF 中,表格每页最多可以有 15 个表格行。每一页都需要计算小计,只对当前页显示的值求和。
我上面的表格(我发现的唯一解决方案是使用表格标记)计算 Page1 的正确小计,但对于 Page2 等失败。它将所有先前页面的小计附加到当前页面。
例如:如果第1页显示的Value元素小计为10,第2页显示的Values小计为20,我的表格将显示在第1页,小计为10,但在第2页,小计将30,而不是 20。谁能帮忙解决这个问题?
提前致谢
【问题讨论】:
-
每页的行数/数据元素数是否已知(例如 15),以便您可以处理例如
for-each select="Root/Data[position() mod 15 = 1]" and then form e.g.` 并求和,例如 sum($data-of-page/Value)? -
是的,每页的行数是已知的(不超过 15 页)。非常感谢,这可以计算总和,但现在我正在努力在表格中显示所有 15 个值。通过在 Root/Data[position() mod 15 = 1] 之后重复,只显示第一个元素和总和。
-
您还可以使用 fo:marker 重写包含小计的标记,然后将该标记检索到页脚区域。页脚区域可能包含包含此小计的“假”表行。见stackoverflow.com/questions/17195230/…
标签: xslt xslt-1.0 xsl-fo subtotal