- From: <RShonk@flowserve.com>
- Date: Fri, 27 Sep 2002 11:47:00 -0400
- To: www-xsl-fo@w3.org
Hi all, I have an xsl that I am using to create pdf invoices. There are two xml files involved with this particular issue that I use for input. The first is header information for invoices and the second is the line items for each invoice. My xsl-fo stylesheet is laid out as a table with a header, containing information from the header xml. A table-body with the line items and a table-footer. Everything is working except when an invoice translates to more than 1 page. What I would like is to have 1 footer when all the line items are processed and another showing running sub-totals when there are more line items to process. I have been playing with xsl, xsl-fo and xml for 2 weeks and would appreciate any pointers in how to accomplish. Hopefully I did not trim too much from my code (or not enough : -) ) Thanks, Richard Shonk Flowserve Corp. ===================== header.xml =========================== <?xml version = '1.0' encoding = 'ISO-8859-1'?> <INVOICES> <INVOICE id="7148" account="143500"> <INVOICE_NBR>52993972</INVOICE_NBR> <INVOICE_DATE>3/10/2000 0:0:0</INVOICE_DATE> <ORDER_NBR>047-93286</ORDER_NBR> <SHOP_REPORT_NBR>MOS 6381</SHOP_REPORT_NBR> <NAME>OCEAN COUNTY UA - CWPCF</NAME> <ADDRESS1>501 HICKORY LANE</ADDRESS1> <ADDRESS2>-</ADDRESS2> <CITY>BAYVILLE</CITY> <STATE>NJ</STATE> <ZIPCODE>08721</ZIPCODE> <COUNTRY>US</COUNTRY> <CUSTOMER_ORDER_NBR>00-WP-102-BI</CUSTOMER_ORDER_NBR> <DESTCODE>031</DESTCODE> <TERMS>01</TERMS> <MULTIPLIER>0</MULTIPLIER> <DATE_SHIPPED>3/8/2000 0:0:0</DATE_SHIPPED> <SHIPPED_VIA>RPS</SHIPPED_VIA> <SHIPPED_FROM>MOOSIC</SHIPPED_FROM> <FREIGHT>4.9</FREIGHT> <TOTAL>1671.18</TOTAL> </INVOICE> <INVOICE id="8972" account="143500"> ............ </INVOICE> </INVOICE> ===================== header.xml =========================== ===================== lineitem.xml =========================== <?xml version = '1.0' encoding = 'ISO-8859-1'?> <LINEITEMS> <LINEITEM id="7148"> <QUANTITY>1</QUANTITY> <PART>807121-35</PART> <DESCRIPTION>CUTTER OSC P</DESCRIPTION> <DISCOUNT>750</DISCOUNT> <LIST>2221.71</LIST> <NET>1666.28</NET> <CCN>27989458</CCN> </LINEITEM> <LINEITEM id="8972"> <QUANTITY>1</QUANTITY> <PART>196782-90</PART> <DESCRIPTION>CUTTER KIT</DESCRIPTION> <DISCOUNT>750</DISCOUNT> <LIST>2271</LIST> <NET>1703.25</NET> <CCN>27474212</CCN> </LINEITEM> <LINEITEM id="8972"> ..... </LINEITEM> <LINEITEM id="8972"> ..... </LINEITEM> </LINEITEMS> ===================== lineitem.xml =========================== ===================== invoice.xsl =========================== <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:Date="http://xml.apache.org/xslt/java/java.util.Date"> <xsl:template match="/invoice-xml-files"> <xsl:variable name="TA-Parties" select="document (@bill-to)/TRANSACTION_PARTIES/TRANSACTION_PARTY"/> <xsl:variable name="details" select="document(@invoice-detail)/LINEITEMS/LINEITEM"/> <!-- [SNIP] --> <!-- BODY --> <fo:flow flow-name="xsl-region-body"> <fo:block/> <xsl:apply-templates select="document(@invoice-header)/INVOICES/INVOICE"> <xsl:with-param name="TA-Parties" select="$TA-Parties"/> <xsl:with-param name="details" select="$details"/> <xsl:with-param name="appPath" select="$appPath"/> </xsl:apply-templates> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> <xsl:template match="INVOICES/INVOICE"> <xsl:param name="TA-Parties"/> <xsl:param name="details"/> <xsl:param name="appPath"/> <xsl:param name="sumItems" select="sum($details[@id=current ()/@id]/NET)"/> <xsl:param name="subTotal" select="number(TOTAL) - number(FREIGHT)"/> <!-- Table to contain the whole document --> <fo:table width="7.5in" table-layout="fixed"> <fo:table-column column-width="7.5in"/> <!-- Table header to emulate page header --> <fo:table-header> [SNIP] <!-- tables with value-of from header.xml --> </fo:table-header> <fo:table-footer> [SNIP] <!-- if all line items are processed show sub-total, freight and grand total from header.xml (this works fine) otherwise show total of all line items processed so far --> </fo:table-footer> <fo:table-body> <fo:table-row> <fo:table-cell> <!-- LINE ITEMS --> <fo:table border-collapse="collapse" border-color="black" border-style="solid" border-width="1pt" height="5.0in" table-layout="fixed"> <fo:table-column column-width=".5in"/> <fo:table-column column-width="1.25in" border-width="1pt" border-color="black" border-left-style="solid"/> <fo:table-column column-width="3.25in" border-width="1pt" border-color="black" border-left-style="solid"/> <fo:table-column column-width=".5in" border-width="1pt" border-color="black" border-left-style="solid"/> <fo:table-column column-width="1in" border-width="1pt" border-color="black" border-left-style="solid"/> <fo:table-column column-width="1in" border-width="1pt" border-color="black" border-left-style="solid"/> <fo:table-body font-family="sans-serif" font-weight="normal"> <xsl:apply-templates select="$details[@id=current()/@id]"/> </fo:table-body> </fo:table> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> </xsl:template> [SNIP] <xsl:template match="LINEITEM"> <fo:table-row line-height="12pt" font-size="10pt"> <fo:table-cell padding-top="1pt" padding-right="3pt"> <fo:block text-align="end"> <xsl:value-of select="QUANTITY"/> </fo:block> </fo:table-cell> <fo:table-cell padding-top="1pt" padding-left="3pt" padding-right ="3pt"> <fo:block text-align="start"> <xsl:value-of select="PART"/> </fo:block> <fo:block text-align="end"> <xsl:value-of select="CCN"/> </fo:block> </fo:table-cell> <fo:table-cell padding-top="1pt" padding-left="3pt" padding-right ="3pt"> <fo:block text-align="start"> <xsl:value-of select="DESCRIPTION"/> </fo:block> <fo:block text-align="end"> <xsl:value-of select="MATERIAL"/> </fo:block> </fo:table-cell> <fo:table-cell padding-top="1pt" padding-right="3pt"> <fo:block text-align="end"> <xsl:if test="DISCOUNT!='0'"> <xsl:value-of select="((1000 - number(DISCOUNT)) div 10)"/>% </xsl:if> </fo:block> </fo:table-cell> <fo:table-cell padding-top="1pt" padding-right="3pt"> <fo:block text-align="end"> <xsl:value-of select="format-number(LIST,'$###,##0.00')"/> </fo:block> </fo:table-cell> <fo:table-cell padding-top="1pt" padding-right="3pt"> <fo:block text-align="end"> <xsl:value-of select="format-number(NET,'$###,##0.00')"/> </fo:block> </fo:table-cell> </fo:table-row> </xsl:template> </xsl:stylesheet> =========================invoice.xsl===========================
Received on Friday, 27 September 2002 11:53:28 UTC