是否可以在XSLT/XSL FO中显示运行总数?
我正在尝试格式化一份报告,我的表格将跨越多个页面,包含各种项目/费用,理想情况下,我希望在表格页脚中显示每页的运行总计,基本上我希望表格中从当前页面到第一页的值的总和显示在底部。有没有办法做到这一点是否可以在XSLT/XSL FO中显示运行总数?,xslt,xsl-fo,Xslt,Xsl Fo,我正在尝试格式化一份报告,我的表格将跨越多个页面,包含各种项目/费用,理想情况下,我希望在表格页脚中显示每页的运行总计,基本上我希望表格中从当前页面到第一页的值的总和显示在底部。有没有办法做到这一点 <fo:table width="100%" border-style="groove" border-width="2pt" background-repeat="repeat"> <fo:table-column column-width="5%" /> <
<fo:table width="100%" border-style="groove" border-width="2pt" background-repeat="repeat">
<fo:table-column column-width="5%" />
<fo:table-column column-width="60%" />
<fo:table-column column-width="5%" />
<fo:table-column column-width="7.5%" />
<fo:table-column column-width="7.5%" />
<fo:table-column column-width="7.5%" />
<fo:table-column column-width="7.5%" />
<fo:table-footer border-top-style="dashed" border-bottom-style="dashed">
<fo:table-cell display-align="center">
</fo:table-cell>
<fo:table-cell display-align="center">
<fo:block text-align="center">
Page <fo:page-number/>
<xsl:text> OF </xsl:text>
<fo:page-number-citation ref-id="end" />
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center">
</fo:table-cell>
<fo:table-cell display-align="center">
</fo:table-cell>
<fo:table-cell display-align="center">
</fo:table-cell>
<fo:table-cell display-align="center">
<fo:block text-align="end">
Page Total:
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center">
</fo:table-cell>
</fo:table-footer>
<fo:table-body>
<xsl:for-each select="/receipt_invoice/details/product_lot">
<xsl:variable name="untitled" select="." />
<fo:table-row>
<fo:table-cell border-style="solid" border-width="1pt" border-color="black" padding="2pt" background-repeat="repeat" display-align="center">
<fo:block text-align="right">
<fo:block>
<xsl:value-of select="lot/quantity" />
</fo:block>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" border-width="1pt" border-color="black" padding="2pt" background-repeat="repeat" display-align="center">
<fo:block>
<fo:table width="100%" border-style="none" border-width="2pt" background-repeat="repeat">
<fo:table-column/>
<fo:table-column/>
<fo:table-body>
<fo:table-row>
<fo:table-cell border-style="none" border-width="2pt" padding="2pt" background-repeat="repeat" display-align="before">
<fo:block>
<fo:block>
<xsl:value-of select="product/code" />
</fo:block>
<fo:block>
Lot Qty:
<xsl:value-of select="lot/quantity" />
</fo:block>
<fo:block>
<xsl:text>
 
</xsl:text>
</fo:block>
<fo:block>
<xsl:value-of select="lot/identifier" />
</fo:block>
<fo:block>
<xsl:value-of select="lot/lot_components/component/label" />
</fo:block>
<fo:block>
<xsl:value-of select="lot/lot_components/component/value" />
</fo:block>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="none" border-width="2pt" padding="2pt" background-repeat="repeat" display-align="before">
<fo:block>
<fo:block>
<xsl:value-of select="product/first_description" />
</fo:block>
<fo:block>
<xsl:value-of select="lot/csd/csd_line" />
</fo:block>
<fo:block>
<xsl:value-of select="lot/csd/set_description" />
</fo:block>
<fo:block>
<xsl:value-of select="lot/lot_components/component/label" />
</fo:block>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
Line Number:
<xsl:value-of select="line_number" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" border-width="1pt" border-color="black" padding="2pt" background-repeat="repeat" display-align="center">
<fo:block text-align="center">
<fo:block>
<xsl:value-of select="product/unit_of_measure" />
</fo:block>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" border-width="1pt" border-color="black" padding="2pt" background-repeat="repeat" display-align="center">
<fo:block text-align="center">
<fo:block>
<xsl:value-of select="stock_charges/storage_rate" />
</fo:block>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" border-width="1pt" border-color="black" padding="2pt" background-repeat="repeat" display-align="center">
<fo:block text-align="center">
<fo:block>
<xsl:value-of select="stock_charges/storage_amount" />
</fo:block>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" border-width="1pt" border-color="black" padding="2pt" background-repeat="repeat" display-align="center">
<fo:block text-align="center">
<fo:block>
<xsl:value-of select="stock_charges/handling_rate" />
</fo:block>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" border-width="1pt" border-color="black" padding="2pt" background-repeat="repeat" display-align="center">
<fo:block text-align="center">
<fo:block>
<xsl:value-of select="stock_charges/handling_amount" />
</fo:block>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
页
属于
总页数:
批次数量:
;
行号:
修订:
因此,我决定使用页脚来显示每页的小计,并在表中设置了一个标记,该标记仅返回总计以进行测试,但现在我想的是,我可以尝试以某种方式获取节点取自的xml文件中的位置,并使用类似于
<xsl:value-of select="sum(preceding::value[the_position]"/>
这里的值实际上是被加总的电荷的名称,这是可行的吗?如果您尝试了不同的方法,但我不确定语法以及如何返回位置。为了完整起见,请将解决方案的描述作为答案发布
如果行的高度非常规则,则可以在输出行时对表结构中所有以前的节点使用sum()函数,并将正在运行的小计作为表/表行放在页面页脚标记中作为单行表。使用页面上的最后一个标记将标记检索到页面页脚(而不是带有检索表标记的表页脚),然后清除标记。仔细调整大小,您可以让它看起来就像一个表尾,您可以清除表尾的标记,这样它就不会出现在其他页面上。对于表尾,只需输出总数 它可能不适用于复杂的表,尤其是在有多行且保留这些行的情况下,因为表可能无法到达页脚
这克服了两个问题(1)您不需要表标记,因为许多FO引擎不支持它们(事实上,这是有充分理由的,因为如果要检索的内容可能具有较大的可变高度,那么它们的问题比您想象的要大得多)。(2)使用表标记可能会在页脚内的表末尾遇到问题,您可能不需要它(尽管您可以清除最后一行的标记)。这听起来像是一个开始:(使用
)在从XML到XSL的转换中,您可以对以前的值求和(如果源代码中不存在该数据)您可以放下标记并使用检索表标记(这是一种XSLFO1.1构造,并非所有FO引擎都支持)。您可以将标记检索到表尾中。问题是,有时您不希望它出现在表尾,使用表尾意味着您得到了它(当然,除非您的FO引擎有一个选项可以省略最后一个表尾或其他内容)。感谢Tomalak,至少它看起来很有希望,也感谢Kevin,不幸的是,我正在设计使用Apache FOP打印的解决方案,它不完全支持多列的表尾,也不支持表标记,如果您知道任何解决方法,将不胜感激。如果您的行高度非常规则,您也可以尝试相同的求和技术,但将小计表行作为单行表放在页面页脚内。使用相同的技术,但将标记拉入页脚,而不是带有检索表标记的表页脚。仔细调整大小,你可以让它看起来像一个表尾,你可以在表尾清除市场,这样它就不会出现在其他页面上。@KevinBrown谢谢你,这实际上是一个很好的解决方案,它似乎与FOP配合得很好,干杯!