是否有可能在XSLT / XSL FO中显示运行总计?

时间:2013-06-19 15:27:01

标签: xslt xsl-fo

我正在尝试格式化一个报表,我的表格会跨越多个页面,包含各种项目/费用,理想情况下我想要显示表格页脚中每个页面的运行总计,基本上我想要的我的表中的值从当前页面返回到底部显示的第一页的总和。有没有办法实现这个目标?

<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>
                          &#xA0;
                        </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]"/> 

如果价值实际上是总计费用的名称,这可能有用吗?如果我一直尝试不同的东西,但我不确定语法以及如何返回位置。

1 个答案:

答案 0 :(得分:1)

为完整起见,将解决方案的说明作为答案发布。

如果您的行具有非常规则的高度,则可以在输出行时将sum()函数用于表结构中的所有先前节点,并将该运行小计作为表/表行放在标记内部用于页脚。页面作为单行表。使用页面上的最后一个将标记检索到页脚(不是带有retrieve-table-marker的表格页脚),然后清除标记。仔细调整大小,你可以让它看起来就像是一个桌面页脚,你可以清除表格末尾的那个标记,这样它就不会出现在其他页面上。对于表结束,只输出总数。

它可能不适用于复杂的表,特别是在存在多行行的情况下,并且由于表格可能无法到达页脚而保留在这些行上。

这克服了两个问题(1)你不需要表格标记,因为许多FO引擎不支持它们(实际上有很好的理由,因为如果被检索的内容可能有一个问题,它们比你想象的要多得多大,可变高度)。并且(2)使用表格标记可以在该页脚内部的表格末端遇到问题,您可能不需要它(尽管您可以清除最后一行的标记)。