2013-06-19 66 views
0

我想格式化一個報告,我有表將跨越多個頁面與各種項目/費用,我想要做的最好的是顯示錶中每頁的運行總計頁腳,基本上我想我的表格中的值從當前頁面返回到底部顯示的第一頁的總和。有什麼辦法可以做到這一點?是否有可能在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]"/> 

當值實際上是收費的名字總結起來,這是可以工作的嗎?如果一直在嘗試不同的事情,但我不確定語法和如何返回位置。

+0

這聽起來像一個開始:http://stackoverflow.com/questions/7931266/how-can-i-sum-up-some-values-per-page-in-a-table-in-xsl-fo (使用'') – Tomalak

+0

在從XML到XSL的轉換中,您可以將以前的值相加(如果該數據不存在於您的源中),並且可以放下標記並使用檢索表-marker(這是一個XSL FO 1.1構造,不是所有的FO引擎支持)。您會將標記檢索到表格頁腳中。與此有關的問題有時你不希望它在表末端,並使用表腳註意味着你得到它(除非你的FO引擎有一個選項可以省略最後一個表腳註或什麼)。 –

+0

感謝Tomalak,它至少看起來很有希望,並且還感謝Kevin,不幸的是我正在設計我的解決方案,使用Apache FOP打印,它不完全支持多列的頁腳,也不支持table所有標記,如果你知道任何工作周圍,但它將不勝感激。 – adam5990

回答

1

爲了完整起見,將解決方案的描述作爲答案發布。

如果你的行高度相當規整,你可以在表格結構中的所有先前節點上使用sum()函數來輸出行,並將該小計作爲表格/表格行放在頁腳標記中該頁面作爲單行表格。使用頁面上的最後一個檢索標記到頁面頁腳(而不是使用檢索表標記的表格頁腳),然後清除標記。仔細確定尺寸,您可以將它看起來就像是一個桌腳,您可以清除桌子底部的標記,以便它不會出現在其他頁面上。對於表格結束,只輸出總數。

它可能無法處理複雜的表格,特別是在有多行的行並且由於表格可能無法到達頁腳而保留在這些行上的情況下。

這克服了兩個問題(1)你不需要表標記,因爲許多FO引擎不支持它們(實際上有很好的理由,因爲如果被檢索的內容可能有更多問題一個巨大的,可變的高度)。和(2)使用表標記可能會遇到問題在表尾的內部,您可能不需要它(儘管您可以清除最後一行中的標記)。

相關問題