I did not found an explicit question like the following:
I want to convert XML to PDF preserving tabspace (ASCII 009) in XSL-FO.
My <fo:block /> looks like this:
<fo:block linefeed-treatment="preserve" white-space-collapse="false" white-space-treatment="preserve">
<xsl:value-of select="orderText" />
</fo:block>
With this configuration I can preserve line breaks and normal spaces but no tab-space. I tried many attributes from this post: Preserving whitespace in PDF after XSL transform
but it still doesn't work. If I put in this:
Forename: John
Surname: Smith
I get this:
Forename: John
Surname: Smith
For Information:
In my XSL-FO I use a Layout-Master for formatting the page. Maybe this could be the problem.
This is the complete XSL-File.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
<xsl:preserve-space elements="orderText" />
<!-- If we see an envelope, we create an FO document -->
<xsl:template match="/tiff">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm"
margin-top="1.5cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
<fo:region-body margin-top="10mm" margin-bottom="5mm" />
<fo:region-before region-name="header" />
<fo:region-after region-name="footer" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body" text-align="justify" font-size="11pt">
<!-- This will call generate stream headers (if applicable) -->
<fo:block font-weight="bold" font-size="12pt" space-after="7mm">
<xsl:text>Informationen zum Auftraggeber</xsl:text>
</fo:block>
<fo:block space-after="7mm">
<fo:table>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>Auftragsnummer</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="orderId" /></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>Erstellt von</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="creator" /></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>Erstellt am</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="createDate" /></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>Verwendete mTAN</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="mTAN" /></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block font-weight="bold" font-size="12pt" space-after="7mm">
<xsl:text>Informationen zum Kunden</xsl:text>
</fo:block>
<fo:block space-after="7mm">
<fo:table>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>ZAD-Kundennummer</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="customerId" /></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>Name</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="surname" /></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>Vorname</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="forename" /></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block font-weight="bold" font-size="12pt" space-after="7mm">
<xsl:text>Informationen zum Vertrag</xsl:text>
</fo:block>
<fo:block space-after="7mm">
<fo:table>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>Versicherungsscheinnummer</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="vsnr" /></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>Bestandsart</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="ba" /></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>Konzerngesellschaft</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="kg" /></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block font-weight="bold" font-size="12pt" space-after="7mm">
<xsl:text>Auftragstext</xsl:text>
</fo:block>
<fo:block linefeed-treatment="preserve" white-space-collapse="false" white-space-treatment="preserve">
<xsl:value-of select="orderText" />
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
XSL-FO does not handle tabs other than being whitespaces. A tab does not have a specific width, and there are not "tab stops" defined in the blocks.
Positioning in XSL-FO is done through block, and position properties. It looks like what you want here, is to use an extra column and split the value in 2: the first part in one cell, the second part in the other.
Related
I have this problem where I need to remove table cells when they are empty. But they always leave a small gap.
If the user fills out every option, the table is normal. If the user only fills out some fields then the table generates this dark horizontal line.
I suspect it is the empty cells bunching up.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" media-type="text/html" />
<xsl:template match="fwcF17Part35Page">
<xsl:apply-templates select="part35Details"/>
</xsl:template>
<xsl:template match="part35Details">
<fo:block keep-together.within-page="always">
<fo:block padding="5pt"/>
<fo:block font-size="16pt" text-align="left">
Upload Documents - test
</fo:block>
<fo:block>
<fo:leader leader-pattern="rule" leader-length="100%" rule-style="solid" rule-thickness="2pt"/>
</fo:block>
<fo:block padding="8pt"/>
<fo:block background-color="#ebe8e8" font-size="10pt" font-weight="bold">
Document(s)
</fo:block>
<fo:block padding="4px" font-size="8pt" font-weight="normal" text-align="center">
<fo:table>
<fo:table-column column-width="50%" />
<fo:table-column column-width="50%" />
<fo:table-header>
<fo:table-row>
<fo:table-cell border-style="solid" padding="2pt">
<fo:block font-weight="bold">Document Name</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" padding="2pt">
<fo:block font-weight="bold">Document Type</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<xsl:for-each select="/root/pages/page_12/sections/fwcF17DocumentUpload/data">
<fo:table-row>
<xsl:choose>
<xsl:when test="size > 0">
<fo:table-cell border-style="solid" padding="2pt">
<fo:block>
<xsl:value-of select="name" />
</fo:block>
</fo:table-cell>
</xsl:when>
<xsl:otherwise>
<fo:table-cell>
<fo:block>
</fo:block>
</fo:table-cell>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="size > 0">
<fo:table-cell border-style="solid" padding="2pt">
<fo:block>
<xsl:value-of select="documentType" />
</fo:block>
</fo:table-cell>
</xsl:when>
<xsl:otherwise>
<fo:table-cell>
<fo:block>
</fo:block>
</fo:table-cell>
</xsl:otherwise>
</xsl:choose>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>
</fo:block>
</xsl:template>
</xsl:stylesheet>
I have tried putting in:
<fo:table-cell visilibity="hidden">
<fo:table-cell display="none">
<fo:table-cell height="0px">
Wrong output when there are empty cells:
Correct output when there are no empty cells:
Only create fo:table-row if your data fulfills the filter size > 0
You can do that by adding a predicate to your for-each.
In addition you can use that same predicate in the match, te ensure that there will be not a invalid fo:table constructed.
The xslt would then look like this:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" media-type="text/html" />
<xsl:template match="fwcF17Part35Page">
<xsl:apply-templates select="part35Details"/>
</xsl:template>
<xsl:template match="part35Details[/root/pages/page_12/sections/fwcF17DocumentUpload/data[size > 0]]">
<fo:block keep-together.within-page="always">
<fo:block padding="5pt"/>
<fo:block font-size="16pt" text-align="left">
Upload Documents - test
</fo:block>
<fo:block>
<fo:leader leader-pattern="rule" leader-length="100%" rule-style="solid" rule-thickness="2pt"/>
</fo:block>
<fo:block padding="8pt"/>
<fo:block background-color="#ebe8e8" font-size="10pt" font-weight="bold">
Document(s)
</fo:block>
<fo:block padding="4px" font-size="8pt" font-weight="normal" text-align="center">
<fo:table>
<fo:table-column column-width="50%" />
<fo:table-column column-width="50%" />
<fo:table-header>
<fo:table-row>
<fo:table-cell border-style="solid" padding="2pt">
<fo:block font-weight="bold">Document Name</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" padding="2pt">
<fo:block font-weight="bold">Document Type</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<xsl:for-each select="/root/pages/page_12/sections/fwcF17DocumentUpload/data[size > 0]">
<fo:table-row>
<fo:table-cell border-style="solid" padding="2pt">
<fo:block>
<xsl:value-of select="name" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" padding="2pt">
<fo:block>
<xsl:value-of select="documentType" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>
</fo:block>
</xsl:template>
</xsl:stylesheet>
It would be really helpful if you would add a minimal xml-source-sample to your question to better understand your xslt.
I.e: your template match: <xsl:template match="part35Details"> looks somewhat strange. The template does not use the context.
I found many answers how to generate running titles and table-headers, but no one fits conditions:
First table fragment should have title "Title of table $tablenum"
From second to rowsCount-1 should have title "Continue of table"
Last table fragment should have title "End of table".
I found retrieve-table-marker, and put markers on each row, but with it i can fit only in 2 conditions:
1-2 (and last table fragment also have "Continue of table" header) with
<retrieve-table-marker retrieve-position-within-table="first-starting"/>
2-3 (First fragment have "Continue of table") with
<retrieve-table-marker retrieve-position-within-table="last-ending"/>
So, it can be solved, if i found how to do one of next thing:
can determine when xslt processing, that current table fragment is last/first
If it possible, i can set something like
<fo:table-row>
<xsl:choose>
<xsl:when test="is-last-fragment()">
<fo:marker marker-class-name="table-header">End of table</fo:marker>
</xsl:when>
<xsl:when test="position() = 1">
<fo:marker marker-class-name="table-header">End of table</fo:marker>
</xsl:when>
<xsl:otherwise>
<fo:marker marker-class-name="table-header">Continue of table</fo:marker>
</xsl:when>
</xsl:choose>
</fo:table-row>
and use <retrieve-table-marker retrieve-position-within-table="first-starting"/> in table header.
can hide first/last marker with other on retrieve-table-marker tag.
I use saxonb-xslt-9.1.0.8J from Saxonica as xslt processor and generate pdf with fop-2.1.
UPD:
XML data:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<numbers>
<number>1</number>
<number>2</number>
<number>2</number>
<number>2</number>
<number>2</number>
<number>2</number>
<number>2</number>
<number>2</number>
<number>11</number>
<number>2</number>
<!-- and so on. Just dummy lines -->
</numbers>
XSL styles:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.1">
<xsl:strip-space elements="*"/>
<xsl:template match="numbers">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="A4">
<fo:region-body region-name="body" margin="2cm"/>
<fo:region-before margin="4cm" extent="2cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
<fo:flow flow-name="body">
<fo:table>
<fo:table-column/>
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block border-bottom-style="solid" border-bottom-color="black">
<fo:retrieve-table-marker retrieve-class-name="cont"
retrieve-position-within-table="last-ending"
retrieve-boundary-within-table="table-fragment"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<xsl:apply-templates/>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="number">
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>
<xsl:if test="position() != 1 and position() != last()">continued</xsl:if>
<xsl:if test="position() = last()">ended</xsl:if>
</fo:inline>
</fo:marker>
<fo:block>
value: <xsl:apply-templates/> on line <xsl:value-of select="position()" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
</xsl:stylesheet>
This produce XSL-FO:
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="A4">
<fo:region-body region-name="body" margin="2cm"/>
<fo:region-before margin="4cm" extent="2cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
<fo:flow flow-name="body">
<fo:table>
<fo:table-column/>
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block border-bottom-style="solid" border-bottom-color="black">
<fo:retrieve-table-marker retrieve-class-name="cont" retrieve-position-within-table="last-ending" retrieve-boundary-within-table="table-fragment"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline/>
</fo:marker>
<fo:block>
value: 1 on line 1</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 2 on line 2</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 2 on line 3</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 2 on line 4</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 2 on line 5</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 2 on line 6</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 2 on line 7</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 2 on line 8</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 11 on line 9</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 2 on line 10</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>continued</fo:inline>
</fo:marker>
<fo:block>
value: 11 on line 11</fo:block>
</fo:table-cell>
</fo:table-row>
<!-- and so on... -->
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="cont">
<fo:inline>ended</fo:inline>
</fo:marker>
<fo:block>
value: 12 on line 172</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
I am trying to format a report and I have tables that will span multiple pages with various items/fees, and what i would like to do ideally is to display a running total for each page in the table footer, basically i want the sum of the values in my table from the current page back to the first page to display at the bottom. Is there any way to achieve this?
<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>
Revision:
So I have decided to use a page footer to display the subtotal on each page, and have set up a marker in my table that simply returns the grand total just to test it out, but now what i was think was that i could try to somehow get the position in my xml file the node was taken from and use something like...
<xsl:value-of select="sum(preceding::value[the_position]"/>
Where value would actually be the name of the charge being totaled up, is this something that could work? If have been trying different things but I am uncertain of the syntax and how to return the position.
For completeness, posting the description of the solution as an answer.
If your rows are of pretty regular height, you can use sum() function over all previous nodes in your table structure as you output rows and put that running subtotal as a table/table row inside a marker for the footer of the page as a single row table. Retrieve the marker into the page footer (not the table-footer with retrieve-table-marker) using the last one on the page, then clear the marker. Careful sizing and you can get it to look just like it is a table footer and you can clear that marker at the end of the table so that it does not appear on other pages. For the table end, just output the totals.
It may not work with complex tables, especially where there are multi-line rows and keeps on those rows as the table may not reach the footer.
This overcomes two issues (1) you do not need table-markers as many FO engines do not support them (actually there are good reasons for this as they are much more problematic than you think if the content being retrieved could have a large, variable height). And (2) using table-markers can run into issues at the end of the table inside that footer where you may not want it (although you can clear the marker at the last row).
I am designing an xsl that will give a pdf output. My pdf output is in landscape format.
I can't get the landscape formatted output even i change the simple page master as follows,
Still my pdf output's height is greater than the width.
Hi mzjn, i dont have any link. attached the expected and resulted pdf outputs, also need to know how to use the border image. tried as background image for region body and failed.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"
exclude-result-prefixes="fo">
<xsl:output method="xml" version="1.0" omit-xml-declaration="no"
indent="yes" />
<xsl:param name="versionParam" select="'1.0'" />
<xsl:template match="#*|node()">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<!-- Start of page layout -->
<fo:layout-master-set>
<fo:simple-page-master master-name="A4"
page-width="8.27in" page-height="11.69in" margin-top="5mm"
margin-bottom="5mm" margin-left="5mm" margin-right="5mm"
reference-orientation="90">
<fo:region-body margin-top=".5cm" margin-bottom=".5cm"
margin-left=".5cm" margin-right=".5cm">
<xsl:if test="isPreview='true'">
<xsl:attribute name="background-image">file:///<xsl:value-of
select="pdfimagepath" />Preview Only1.JPG</xsl:attribute>
</xsl:if>
</fo:region-body>
<fo:region-before extent="0mm" />
<fo:region-after extent="0mm" />
</fo:simple-page-master>
</fo:layout-master-set>
<!-- End of page layout -->
<fo:page-sequence master-reference="A4">
<fo:static-content flow-name="xsl-region-before">
<fo:block>
<fo:leader></fo:leader>
</fo:block>
<fo:block text-align="right" font-size="9pt" font-weight="bold">
<xsl:value-of select="num" />
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-region-after">
<fo:block font-size="9pt" font-family="times" text-align="left">
<xsl:value-of select="xxx" />
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:table table-layout="fixed" width="100%">
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell width="100%">
<fo:block text-align="center" padding-top="2pt">
<fo:external-graphic content-height="85%"
content-width="65%" scaling="uniform">
<xsl:attribute name="src">
<xsl:value-of select="pdfimagepath" />LogoCert.jpg
</xsl:attribute>
</fo:external-graphic>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell width="100%">
<fo:block text-align="center">
<fo:external-graphic content-height="45%"
content-width="55%" scaling="non-uniform">
<xsl:attribute name="src">
<xsl:value-of select="pdfimagepath" />title.jpg
</xsl:attribute>
</fo:external-graphic>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell width="100%">
<fo:block font-size="15.5pt" font-family="Arial"
color="Black" text-align="center" padding-before="5pt"
start-indent="10pt">
</fo:block>
<fo:block font-size="15.5pt" font-family="Arial"
color="Black" text-align="center" start-indent="5pt">xxxxxx:
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell width="100%">
<fo:block font-size="16.5pt" font-family="Arial"
color="red" text-align="center" padding-before="8pt">
<xsl:value-of select="custname" />
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell width="100%">
<fo:block font-size="13.5pt" font-family="Arial"
color="black" text-align="center" padding-before="10pt"
start-indent="10pt">
<fo:inline background-color="yellow">xxxx</fo:inline>xxxx
</fo:block>
<fo:block font-size="13.5pt" font-family="Arial"
color="black" text-align="center" start-indent="10pt"> xxxx
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-start="140pt" padding-end="140pt">
<fo:block font-size="10pt" font-family="Arial" color="black"
text-align="center" border-bottom="solid">
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell display-align="after"
padding-after="12pt" padding-before="2pt">
<fo:block font-size="15.5pt" font-family="Arial"
color="black" text-align="center"> xxxx
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-start="160pt" padding-end="160pt">
<fo:block font-size="10pt" font-family="Arial" color="black"
text-align="center" border-bottom="solid">
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-before="2pt"
display-align="before">
<fo:block font-size="15.5pt" font-family="Arial"
color="black" text-align="center">
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-before="10pt">
<fo:block font-size="8.5pt" font-family="Arial"
color="black" text-align="center"> xxxx
</fo:block>
<fo:block font-size="8.5pt" font-family="Arial"
color="black" text-align="center">
</fo:block>
<fo:block font-size="8.5pt" font-family="Arial"
color="black" text-align="center">
</fo:block>
<fo:block font-size="8.5pt" font-family="Arial"
color="black" text-align="center">
</fo:block>
<fo:block font-size="8.5pt" font-family="Arial"
color="black" text-align="center">
</fo:block>
<fo:block font-size="8.5pt" font-family="Arial"
color="black" text-align="center">
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-before="5pt"
padding-start="60pt" padding-end="60pt">
<fo:block font-size="20pt" font-family="Arial" color="black"
text-align="center" border-bottom="solid">
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-width="40%" />
<fo:table-column column-width="60%" />
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell padding-before="5pt">
<fo:block font-size="9.5pt" text-align="left"
font-weight="normal">
</fo:block>
</fo:table-cell>
<fo:table-cell padding-before="5pt">
<fo:block font-size="9.5pt" text-align="center">
</fo:block>
<fo:block font-size="9.5pt" text-align="center"
end-indent="10pt">
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-width="50%" />
<fo:table-column column-width="50%" />
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell padding-before="5pt"
display-align="after" border="">
<fo:block font-size="10pt" text-align="left"
font-weight="normal">
</fo:block>
<fo:block font-size="13.5pt" text-align="center"
font-weight="normal">
</fo:block>
</fo:table-cell>
<fo:table-cell padding-before="5pt"
display-align="after" border="">
<fo:block text-align="center">
<fo:external-graphic content-height="60%"
content-width="40%" scaling="uniform">
<xsl:attribute name="src">
<xsl:value-of select="pdfimagepath" />sign.jpg
</xsl:attribute>
</fo:external-graphic>
</fo:block>
<fo:block padding-bottom="1pt" font-size="15pt"
text-align="center" font-weight="bold">
_____________________________
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell display-align="after" border="">
<fo:block font-size="8pt" text-align="left"
font-weight="normal">
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="after" border=""
padding-before="1pt">
<fo:block font-size="8.5pt" text-align="center"
font-weight="normal">xxxxx
</fo:block>
<fo:block font-size="8.5pt" text-align="center"
font-weight="normal">yyyyy
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
code sample attached
I am using Apache FOP 1.1.First you should define layout of landscape(A2).For Example
<fo:layout-master-set>
<fo:simple-page-master master-name="A2"
page-height="594mm" page-width="420mm" margin-left="0.2cm"
margin-right="0.2cm">
<fo:region-body margin-top="0.5cm" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A2">
<fo:flow flow-name="xsl-region-body">
**//your design and logic**
</fo:flow>
</fo:page-sequence>
Thank you.
I'm not sure how to set the background, but below is how I was able to change the page width and height to result in landscape orientation.
I'm editing xsl files for PDF2 that came with the DITA open toolkit. I'm not sure if the filename will be the same, but I found the below chunk of code in layout-masters-attr.xsl. Notice I switched the page-width and page-height variables.
<xsl-attribute-set name="simple-page-master">
<xsl-attribute name="page-width">
<xsl:value-of select="$page-height"/>
</xsl:attribute>
<xsl:attribute name="page-height">
<xsl:value-of select="$page-width"/>
</xsl:attribute>
</xsl:attribute-set>
This will set the entire PDF document to landscape mode. Also, you can find where the variables are defined and change them to other values, if desired.
I have an XSLT stylesheet that outputs XSL-FO, which is used to generate a PDF file. I am returning bookings of the current week and want to print the bookings in the PDF file grouped-by the weekday. Everything works fine except for the weekday which the booking belongs to.
To illustrate my problem, I have made a screenshot of my generated PDF file:
WeeklyBPlan
As you can see on the picture, the first three bookings belongs to 25.Dezember.2012. If I put the xsl:for-each like in the code I posted, then the the weekday is displayed on each booking.
If I put the xsl:for-each in the table body, all bookings, whether the booking belongs to 26.dezember or 27. dezember, get assigned to 25.dezember. I don't know what I am doing wrong. How can I print the weekdays with the bookings correctly?
<xsl:template match="/">
<fo:root>
<!-- defines the layout master -->
<fo:layout-master-set>
<fo:simple-page-master master-name="first"
page-height="29.7cm"
page-width="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="2cm"
margin-right="2cm">
<fo:region-body margin-top="3cm" margin-bottom="1.5cm"/>
<fo:region-before region-name="kopf" extent="3cm"/>
<fo:region-after region-name="fuss" extent="1.5cm"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="quer"
page-width="29.7cm"
page-height="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="2cm"
margin-right="2cm">
<fo:region-body margin-top="1cm" margin-bottom="1.5cm" />
<fo:region-before region-name="kopf" extent="1cm"/>
<fo:region-after region-name="fuss" extent="0.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<!-- starts actual layout -->
<fo:page-sequence master-reference="quer">
<fo:static-content flow-name="kopf">
<fo:block font-weight="bold" text-align="center" font-family="Arial" font-size="18pt">
<xsl:text>Test</xsl:text>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="fuss">
<fo:block border-bottom-width="thin" border-bottom-style="solid"
border-bottom-color="black" font-weight="bold" text-align="right" font-family="Arial" font-size="9pt">
erstellt am:
<xsl:value-of select="lfsExtension:FormatDateTime(.//Erstellt, 'dd.MM.yy HH:mm')"/>
<xsl:text> Seite: </xsl:text><fo:page-number/>/<fo:page-number-citation ref-id="lastBlock"/>
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<!--this defines a title level 1 -->
<xsl:for-each select=".//WeeklyBPlan" >
<fo:block
line-height="24pt"
space-after.optimum="15pt"
padding-top="3pt">
<xsl:value-of select=".//WEEKDAY" />
</fo:block>
<!-- table start -->
<fo:table table-layout="fixed" border="solid" border-collapse="collapse" border-width="0.5pt">
<fo:table-column column-width="25mm"/>
<fo:table-column column-width="12mm"/>
<fo:table-column column-width="20mm"/>
<fo:table-column column-width="50mm"/>
<fo:table-column column-width="20mm"/>
<fo:table-column column-width="25mm"/>
<fo:table-column column-width="10mm"/>
<fo:table-column column-width="30mm"/>
<fo:table-column column-width="35mm"/>
<fo:table-column column-width="35mm"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Raum</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Zeit</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Abteilung</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Thema</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Mieter</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Tel.-Nr</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">PAnz</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Bestuhlung</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Bemerkung</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block background-color="grey"
color="white" text-align="center">Ausstattung</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell border-right-width="0.5pt" border-right-style="solid" border-bottom-width="0.5pt" border-bottom-style="solid" padding-right="6pt" padding-left="6pt" >
<fo:block font-family="Arial" font-size="9pt" padding="2pt">
<xsl:value-of select=".//Raum" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-right-width="0.5pt" border-right-style="solid" border-bottom-width="0.5pt" border-bottom-style="solid">
<fo:block font-family="Arial" font-size="9pt" padding="2pt" text-align="center">
<xsl:value-of select=".//Zeit" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-right-width="0.5pt" border-right-style="solid" border-bottom-width="0.5pt" border-bottom-style="solid">
<fo:block font-family="Arial" font-size="9pt" padding="2pt" text-align="center">
<xsl:value-of select=".//Abteilung" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-right-width="0.5pt" border-right-style="solid" border-bottom-width="0.5pt" border-bottom-style="solid" padding-left="6pt" padding-right="6pt">
<fo:block font-family="Arial" font-size="9pt" padding="2pt" wrap-option="no-wrap" >
<xsl:value-of select=".//Thema" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-right-width="0.5pt" border-right-style="solid" border-bottom-width="0.5pt" border-bottom-style="solid">
<fo:block font-family="Arial" font-size="9pt" padding="2pt" text-align="center">
<xsl:value-of select=".//Mieter" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-right-width="0.5pt" border-right-style="solid" border-bottom-width="0.5pt" border-bottom-style="solid">
<fo:block font-family="Arial" font-size="9pt" padding="2pt" text-align="center">
<xsl:value-of select=".//Mieter_Tel" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-right-width="0.5pt" border-right-style="solid" border-bottom-width="0.5pt" border-bottom-style="solid">
<fo:block font-family="Arial" font-size="9pt" padding="2pt" text-align="center">
<xsl:value-of select=".//Personen" />
</fo:block>
</fo:table-cell>
<fo:table-cell border-right-width="0.5pt" border-right-style="solid" border-bottom-width="0.5pt" border-bottom-style="solid">
<fo:block font-family="Arial" font-size="9pt" padding="2pt" text-align="center">
<xsl:value-of select=".//Bestuhlung" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding-left="8pt" border-right-style="solid" border-bottom-width="0.5pt" border-right-width="0.5pt" border-bottom-style="solid" >
<fo:block font-family="Arial" font-size="9pt" padding="2pt">
<xsl:value-of select=".//Bemerkung" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding-left="6pt" padding-right="6pt" border-bottom-width="0.5pt" border-bottom-style="solid">
<fo:block font-family="Arial" font-size="9pt" padding="2pt">
<xsl:value-of select=".//Ausstattung" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<!-- table end -->
</xsl:for-each>
<fo:block id="lastBlock"/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
Use for-each-group to group by Date
<xsl:for-each-group select=".//WeeklyBPlan" group-by="/WEEKDAY">
<fo:block line-height="24pt" space-after.optimum="15pt"
padding-top="3pt">
<xsl:value-of select="current-grouping-key()" />
</fo:block>
//table header here
<xsl:for-each select="current-group()">
// populate table row
</xsl:for-each>
</xsl:for-each-group>