Count everything what its behind a xml element using XSL - variables

I need to do this table:
nome idade
1006 … …
1007 … …
1008 … …
1009 … …
1010 … …
1011 … …
1012 … …
1013 … …
And the problem is to get that counting(1006,1007..) because in the xml i get something like this:
<class>
<refclass>10</refclass>
<begin>6</begin>
<part>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
</part>
<part>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
</part>
<part>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
</part>
<class>
So:
<fo:table-cell border-collapse="collapse" border-color="gray"
font-family="Helvetica" font-size="8pt" border="solid 1pt gray"
padding="1pt" display-align="before">
<fo:block text-align="center">
Inside here i need the code to take refclass number and concat with the count that starts at in this case 6 (<begin>)... counting inside the first tag <part> is easy because i can just sum to the position() of each <dados>, but i dont know how to save the value from the first part and keep counting in next <part> tag...
So the idea is how i can keep counting the <dados> tag.
</fo:block>
<fo:table-cell>
Please i realy need a solution, the rest is not a problem... but i cant change variables, and the number of dados tag are variable...
I cant change XML output.
I think in a solution to write the value in xml docment and take it to keep counting, i dont know if it is possible.

Instead of using position(), try using xsl:number.
Here's an example to get you started...
XML Input
<class>
<refclass>10</refclass>
<begin>6</begin>
<part>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
</part>
<part>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
</part>
<part>
<dados>
<nome>...</nome>
<idade>---</idade>
</dados>
</part>
</class>
XSLT 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">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
<fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:table>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block/>
</fo:table-cell>
<fo:table-cell>
<fo:block>nome</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>idade</fo:block>
</fo:table-cell>
</fo:table-row>
<xsl:apply-templates select="part/dados"/>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="dados">
<xsl:variable name="level">
<xsl:number level="any"/>
</xsl:variable>
<fo:table-row>
<fo:table-cell>
<fo:block><xsl:value-of select="concat(/*/refclass,format-number(($level+/*/begin)-1,'00'))"/></fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="nome"/></fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="idade"/></fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
</xsl:stylesheet>
XSL-FO Output
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
<fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:table>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block/>
</fo:table-cell>
<fo:table-cell>
<fo:block>nome</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>idade</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>1006</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>...</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>---</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>1007</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>...</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>---</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>1008</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>...</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>---</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>1009</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>...</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>---</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>1010</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>...</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>---</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>1011</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>...</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>---</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>1012</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>...</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>---</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>1013</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>...</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>---</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
PDF Representation

Related

What XSLT:FO layout should I use for my multi-page iterative PDF converter?

I am using Apache's XML Graphics FOP 2.6 to create a PDF document containing at least 2 pages. There is no maximum number of pages.
The exact same header is used on every page.
Page 1 (see attached)
Needs to contain text with the total number of boxes, the total number of items included in the total number of boxes and a table with 1, 2 or 3 rows. On each row, there is a photo of the box, its name and the number of items it contains. There will be at least one box containing at least one item.
Page 2
Exists only if there are 4 or more boxes and it contains rows 4, 5, 6, 7, 8 and 9 (6 rows in total) of the table from Page 1. If there are more than 9 (= 3 + 6 X 1) boxes, there needs to be a new page that will contain the layout from Page 2, but containing the rows for boxes 10, ..., 15. This pattern will be followed until the last box.
Page 3
Will contain the photo, name and number of items of the first box. Underneath there will be a table, with a row containing the column names and at most 4 rows, corresponding to the first 4 items from the first box.
Page 4
If the first box has more than 4 items, there will be new page, called Page 4, containing only the continuation of the table, including the row with the column names. It will have 7 items in total and be followed by another page if the first box has more than 11 (= 4 + 7 X 1) items. And so on until the end of all items.
Page 5 (not attached to avoid repetition)
Will follow the same logic as Page 3, but in this case for the second box, if there is a second box. And so on until the end of all boxes.
Can anyone, please help me with an idea on how to build the layout-master-set in the XSL file for my requirements? I am not looking for the entire solution. Only for the general layout structure. The answer does not have to be too detailed or too bespoke for my needs. I can adapt it if needed.
<xsl:template match="/doc">
<xsl:variable name="Logo"><xsl:value-of select="Logo"/></xsl:variable>
...
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"
font-family="Nexus Sans Pro" font-weight="normal">
<fo:layout-master-set>
<fo:simple-page-master master-name="Boxes-A4" page-width="297mm" page-height="210mm"
margin-top="0mm" margin-bottom="0mm" margin-left="0mm" margin-right="0mm">
<fo:region-body region-name="xsl-region-body"/>
<fo:region-before region-name="xsl-region-before" extent="70mm"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="Items-A4" page-width="297mm" page-height="210mm"
margin-top="0mm" margin-bottom="0mm" margin-left="0mm" margin-right="0mm">
<fo:region-body region-name="xsl-region-body"/>
<fo:region-before region-name="xsl-region-before" extent="70mm"/>
</fo:simple-page-master>
</fo:layout-master-set>
I have tried the code above (using xsl:stylesheet version="1.0"), but have failed in getting things to be laid out appropriately. The rows of the table that do not fit on a page do not get displayed on the following page, even though I mark appropriate rows with break-before="page" aka page-break-before="always".
As an aid, I can insert the indices from the backend data structure into the parameters used by the library so that I know each element's index.
Thank you very much.
Page 1
Page 2
Page 3
Page 4
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/doc">
<fo:root font-family="Nexus Sans Pro" font-weight="normal">
<fo:layout-master-set>
<fo:simple-page-master master-name="Boxes-A4" page-width="297mm" page-height="210mm"
margin-top="0mm" margin-bottom="0mm" margin-left="0mm" margin-right="0mm">
<fo:region-body region-name="xsl-region-body"/>
<fo:region-before region-name="xsl-region-before" extent="70mm"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="Items-A4" page-width="297mm" page-height="210mm"
margin-top="0mm" margin-bottom="0mm" margin-left="0mm" margin-right="0mm">
<fo:region-body region-name="xsl-region-body"/>
<fo:region-before region-name="xsl-region-before" extent="70mm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<xsl:call-template name="boxes-template"/>
<xsl:call-template name="items-template"/>
</fo:root>
</xsl:template>
<xsl:template name="boxes-template">
<fo:page-sequence master-reference="Boxes-A4" font-family="Nexus Sans Pro" font-weight="normal">
<fo:static-content flow-name="xsl-region-before">
<fo:block-container border-bottom-width="1pt"
border-bottom-style="solid"
border-bottom-color="rgb(220,220,220)"
position="absolute" top="1mm" left="5mm" right="5mm" height="60mm">
<xsl:variable name="Logo" select="Logo"/>
<fo:block-container
background-image="url({$Logo})"
top="5mm" left="5mm" width="50mm" height="50mm"
background-repeat="no-repeat"
fox:background-image-width="50mm" fox:background-image-height="50mm"
absolute-position="absolute">
<fo:block/>
</fo:block-container>
<xsl:variable name="Stamp" select="Stamp"/>
<fo:block-container
background-image="url({$Stamp})"
top="5mm" right="5mm" width="50mm" height="50mm"
background-repeat="no-repeat"
fox:background-image-width="50mm" fox:background-image-height="50mm"
absolute-position="absolute">
<fo:block/>
</fo:block-container>
<fo:block-container position="absolute" top="8mm" left="80mm" width="120mm" height="42mm">
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-width="100%"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell height="12mm">
<fo:block font-family="Nexus Sans Pro Bold"
text-align="center" font-size="32pt"> Header Text
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell display-align="after" height="10mm">
<fo:block font-family="Nexus Sans Pro"
display-align="after" text-align="center" font-size="32pt"
color="rgb(233,113,28)">
<xsl:value-of select="user"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block-container>
<fo:block-container position="absolute" top="48mm" left="77mm" width="157mm" height="10mm">
<fo:table table-layout="fixed" width="100%">
<fo:table-body>
<fo:table-row>
<fo:table-cell height="10mm">
<fo:block font-family="Nexus Sans Pro" font-weight="normal" font-size="15pt"
color="rgb(128,128,128)">
From:
<xsl:value-of select="fromDate"/>
</fo:block>
</fo:table-cell>
<fo:table-cell height="10mm">
<fo:block font-family="Nexus Sans Pro" font-weight="normal" font-size="15pt"
color="rgb(128,128,128)">
To:
<xsl:value-of select="toDate"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block-container>
</fo:block-container>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block-container position="absolute" top="75mm" left="110mm" width="120mm" height="20mm">
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-number="1" column-width="50%"/>
<fo:table-column column-number="2" column-width="50%"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell height="10mm">
<fo:block
font-family="Nexus Sans Pro Bold"
font-size="15pt" color="rgb(35,31,32)">
Total number of boxes:
</fo:block>
</fo:table-cell>
<fo:table-cell height="10mm">
<fo:block font-family="Nexus Sans Pro Bold"
font-size="15pt" color="rgb(35,31,32)">
<xsl:value-of select="totalNumberOfBoxes"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell height="10mm">
<fo:block font-family="Nexus Sans Pro Bold"
font-size="15pt" color="rgb(35,31,32)">
Total number of items:
</fo:block>
</fo:table-cell>
<fo:table-cell height="10mm">
<fo:block font-family="Nexus Sans Pro Bold"
font-size="15pt" color="rgb(35,31,32)">
<xsl:value-of select="totalNumberOfItems"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block-container>
<xsl:for-each select="/doc/box">
<xsl:variable name="boxImageURL" select="boxImageURL"/>
<fo:block-container position="absolute" top="105mm" left="30mm" width="220mm" height="26mm">
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-number="1" column-width="15%"/>
<fo:table-column column-number="2" column-width="70%"/>
<fo:table-column column-number="3" column-width="15%"/>
<fo:table-body>
<fo:table-row page-break-inside="auto"
border-top-width="1pt"
border-top-style="solid"
border-top-color="rgb(220,220,220)"
margin-bottom="2mm"
height="24mm">
<fo:table-cell>
<xsl:if test="$boxImageURL != 'null'">
<fo:block-container
background-image="url({$boxImageURL})"
top="110mm" right="15mm" width="15mm" height="20mm"
background-repeat="no-repeat" margin-top="2mm"
fox:background-image-width="15mm" fox:background-image-height="20mm">
<fo:block/>
</fo:block-container>
</xsl:if>
</fo:table-cell>
<fo:table-cell display-align="center" height="20mm">
<fo:block text-align="left" font-size="16pt" color="rgb(35,31,32)">
<xsl:value-of select="boxTitle"/>
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center" height="20mm">
<fo:block text-align="left" font-size="16pt" color="rgb(35,31,32)">
<xsl:value-of select="numberOfItems"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block-container>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</xsl:template>
<xsl:template name="items-template">
<xsl:variable name="Logo"><xsl:value-of select="Logo"/></xsl:variable>
<xsl:variable name="Stamp"><xsl:value-of select="Stamp"/></xsl:variable>
<xsl:variable name="user"><xsl:value-of select="user"/></xsl:variable>
<xsl:variable name="fromDate"><xsl:value-of select="fromDate"/></xsl:variable>
<xsl:variable name="toDate"><xsl:value-of select="toDate"/></xsl:variable>
<xsl:for-each select="/doc/box">
<xsl:variable name="boxImageURL" select="boxImageURL"/>
<fo:page-sequence master-reference="Items-A4" font-family="Nexus Sans Pro" font-weight="normal">
<fo:static-content flow-name="xsl-region-before">
... Same header as on the Box-A4
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block-container page-break-before="always"
position="absolute" top="70mm" left="30mm" width="220mm" height="24mm">
<fo:table page-break-before="always" table-layout="fixed" width="100%">
<fo:table-column column-number="1" column-width="15%"/>
<fo:table-column column-number="2" column-width="85%"/>
<fo:table-body>
<fo:table-row margin-bottom="2mm"
height="22mm">
<fo:table-cell>
<xsl:if test="$boxImageURL != 'null'">
<fo:block-container
background-image="url({$boxImageURL})"
top="110mm" right="15mm" width="15mm" height="20mm"
background-repeat="no-repeat" margin-top="2mm"
fox:background-image-width="15mm" fox:background-image-height="20mm">
<fo:block/>
</fo:block-container>
</xsl:if>
</fo:table-cell>
<fo:table-cell display-align="center" height="20mm">
<fo:block margin-top="4mm" text-align="left" font-size="16pt" color="rgb(35,31,32)">
<xsl:value-of select="boxTitle"/>
<fo:block margin-top="4mm" text-align="left" font-size="16pt" color="rgb(35,31,32)">
<xsl:value-of select="numberOfThings"/> things
</fo:block>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block-container>
<fo:block-container position="absolute" top="100mm" left="30mm" width="220mm" height="24mm">
<fo:table page-break-before="always" table-layout="fixed" width="100%">
<fo:table-column column-number="1" column-width="60%"/>
<fo:table-column column-number="2" column-width="15%"/>
<fo:table-column column-number="3" column-width="25%"/>
<fo:table-body>
<fo:table-row border-top-width="1pt"
border-top-style="solid"
border-top-color="rgb(220,220,220)"
margin-bottom="2mm"
height="22mm">
<fo:table-cell display-align="center" height="20mm">
<fo:block text-align="left" font-size="16pt" color="rgb(35,31,32)">
Item title
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center" height="20mm">
<fo:block text-align="left" font-size="16pt" color="rgb(35,31,32)">
Revision
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center" height="20mm">
<fo:block text-align="left" font-size="16pt" color="rgb(35,31,32)">
Date completed
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block-container>
<fo:block-container position="absolute" top="125mm" left="30mm" width="220mm" height="24mm">
<fo:table page-break-before="always" table-layout="fixed" width="100%">
<fo:table-column column-number="1" column-width="60%"/>
<fo:table-column column-number="2" column-width="15%"/>
<fo:table-column column-number="3" column-width="25%"/>
<fo:table-body>
<xsl:for-each select="items/item">
<fo:table-row keep-together.within-page="always"
break-after="page"
border-top-width="1pt"
border-top-style="solid"
border-top-color="rgb(220,220,220)"
margin-bottom="2mm"
height="22mm">
<fo:table-cell display-align="center" height="20mm">
<fo:block text-align="left" font-size="16pt" color="rgb(35,31,32)">
<xsl:value-of select="itemTitle"/>
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center" height="20mm">
<fo:block text-align="left" font-size="16pt" color="rgb(35,31,32)">
<xsl:value-of select="revision"/>
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center" height="20mm">
<fo:block text-align="left" font-size="16pt" color="rgb(35,31,32)">
<xsl:value-of select="dateCompleted"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block-container>
</fo:flow>
</fo:page-sequence>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
My simplified parameters.xml (lacking a few lines):
<doc>
<Logo>ELogo.jpg</Logo>
<Stamp>Stamp.jpg</Stamp>
<backgroundImageURL>bkg.jpg</backgroundImageURL>
<user>John Richard Edgar Bowens-Robins III</user>
<fromDate>1st March 2021</fromDate>
<toDate>31 November 2021</toDate>
<totalNumberOfBoxes>5</totalNumberOfBoxes>
<totalNumberOfItems>19</totalNumberOfItems>
<box>
<boxImageURL>box1.jpg</boxImageURL>
<boxTitle>JREBR's Box 1</boxTitle>
<items>
<item>
<itemTitle>The Nice Item 11</itemTitle>
</item>
<item>
<itemTitle>The Nice Item 12</itemTitle>
</item>
<item>
<itemTitle>The Nice Item 13</itemTitle>
</item>
</items>
</box>
<box>
<boxImageURL>box2.jpg</boxImageURL>
<boxTitle>JREBR's Box 2</boxTitle>
<items>
<item>
<itemTitle>The Nice Item 21</itemTitle>
</item>
<item>
<itemTitle>The Nice Item 22</itemTitle>
</item>
<item>
<itemTitle>The Nice Item 23</itemTitle>
</item>
</items>
</box>
</doc>
What you really call "Page 1", "Page 2" ... you really mean this:
Section 1 which is all the boxes. This could be 1 to x pages depending on the quantity of boxes. All the page templates are the same so this is one page sequence with one page master.
Section 2 to n which is a page sequence for each box listing all the items. All of these page sequences are the same (one simple page master).
You do not explain what photo 1 and photo 2 are in the header for these but I would assume they are the same for every page. If that is not true and are different for "boxes" and "items" then possibly you may have different headers.
So you only have two simple-page-masters one called "boxes" and one called "items". You would just create the "boxes" page-sequence referencing the simple-page-master for boxes. You do not present a sample XML, so let's just say it looks like this for simplicity:
<order>
<box>
<name>Box 1</name>
<items>
<item>Item 1:1</item>
<item>Item 1:2</item>
<item>Item 1:3</item>
</items>
</box>
<box>
<name>Box 2</name>
<items>
<item>Item 2:1</item>
<item>Item 2:2</item>
<item>Item 2:3</item>
</items>
</box>
<box>
<name>Box 3</name>
<items>
<item>Item 3:1</item>
<item>Item 3:2</item>
<item>Item 3:3</item>
</items>
</box>
</order>
Then this simple XSL would throw pages for boxes and items in those boxes:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="boxes" page-width="7in" page-height="4in">
<fo:region-body region-name="body" margin-top="0.5in" margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="items" page-width="7n" page-height="4in">
<fo:region-body region-name="body" margin-top="0.5in" margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<xsl:call-template name="boxes"/>
<xsl:call-template name="items"/>
</fo:root>
</xsl:template>
<xsl:template name="boxes">
<fo:page-sequence master-reference="boxes">
<fo:flow flow-name="body">
<!-- Output the table of boxes -->
<xsl:for-each select="/order/box">
<fo:block>
<xsl:value-of select="name"/>
</fo:block>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</xsl:template>
<xsl:template name="items">
<xsl:for-each select="/order/box">
<fo:page-sequence master-reference="items">
<fo:flow flow-name="body">
<xsl:for-each select="items/item">
<fo:block>
<xsl:value-of select="."/>
</fo:block>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
This results in:
Combining this with #Tony Graham's suggestion on doing the tables and you have the whole layout. If you wonder how that works with automatic page flows, here is the exact example above with a few more boxes and one box (Box 4) with more items ... I only changed the fo:block font-size to cause pagination.
Use fo:table, and for each fo:table-row specify height (https://www.w3.org/TR/xsl11/#height) with a suitable value that will get you the required number of rows per page.
You may also need to specify keep-together.within-page="always" to avoid breaking a table row. FOP may or may not support that on fo:table-row (or fo:table-cell).

Sorting out a discrepancy between a pdf generated by FOP v0.20.5 and v2.1

I am currently trying to upgrade our application's FOP dependency from version 0.20.5 to 2.1, and I'm comparing the PDFs generated by various XSL-FO documents in order to minimize the chance that the PDF output looks different to our users.
Here is one of the XSL-FO documents that I'm using to test:
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master page-width="8.5in" page-height="11in" master-name="standard">
<fo:region-body margin-left="0.25in"
margin-right="0.25in"
margin-top="0.5in"
margin-bottom="1.00in"/>
<fo:region-before extent="0.25in"/>
<fo:region-after extent="0.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="standard" force-page-count="no-force">
<fo:static-content margin-left="0.25in"
margin-right="0.25in"
flow-name="xsl-region-before">
<fo:block text-align="center"/>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:block hyphenate="true" language="en" wrap-option="wrap"/>
<fo:block padding="5px">
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="left">
<fo:block>TEST</fo:block>
</fo:table-cell>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="right">
<fo:block>TEST</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block/>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block padding="5px"/>
<fo:block padding="5px"/>
<fo:block padding="5px">
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="center">
<fo:block>
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-number="1" column-width="50%"/>
<fo:table-column column-number="2" column-width="50%"/>
<fo:table-body vertical-align="middle">
<fo:table-row>
<fo:table-cell>
<fo:block text-align="left">TEST</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="end">TEST</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block/>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block padding="5px"/>
<fo:block font-size="16pt" padding="2px">TEST</fo:block>
<fo:block padding="5px">
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-width="1in"/>
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="left">
<fo:block>TEST</fo:block>
</fo:table-cell>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="center">
<fo:block>TEST</fo:block>
</fo:table-cell>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="center">
<fo:block>TEST</fo:block>
</fo:table-cell>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="center">
<fo:block>TEST</fo:block>
</fo:table-cell>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="center">
<fo:block>TEST</fo:block>
</fo:table-cell>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="center">
<fo:block>TEST</fo:block>
</fo:table-cell>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="center">
<fo:block>TEST</fo:block>
</fo:table-cell>
<fo:table-cell border="0.25pt solid #999"
font-size="10pt"
font-weight="bold"
padding="5pt"
text-align="center">
<fo:block>TEST</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block/>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block hyphenate="true"
language="en"
wrap-option="wrap"
font-weight="bold">Test sentence</fo:block>
</fo:block>
<fo:block id="last-page"/>
</fo:flow>
</fo:page-sequence>
</fo:root>
With v2.1 the border of the table-headers is thinner and the spacing of the various pdf elements is slightly greater than that in the v0.20.5 generated PDF. These differences may seem minor, but with larger documents the spacing issue becomes more and more apparent.
I've tried moving the border attributes to different elements (e.g. fo:table-row, fo:block) to no avail.
Here are pictures of the generated reports. Opening them in two tabs and flipping between them will make their differences more apparent.
PDF generated with v0.20.5:
PDF generated with v2.1
Any help determining why there are these minor discrepancies between the 2 generated reports would be very helpful, thanks!

How to split table after certain number of columns

I have a little issue that I've been struggling with for a couple of days now.
Here is input xml:
<Facture>
<Mensualite>
<Lines>
<Line>
<NumeroMensualite>1</NumeroMensualite>
<AnneeEcheance>2015</AnneeEcheance>
<DateEcheance>20150618</DateEcheance>
<Montant>163.14</Montant>
</Line>
<Line>
<NumeroMensualite>2</NumeroMensualite>
<AnneeEcheance>2015</AnneeEcheance>
<DateEcheance>20150718</DateEcheance>
<Montant>120</Montant>
</Line>
<Line>
<NumeroMensualite>3</NumeroMensualite>
<AnneeEcheance>2015</AnneeEcheance>
<DateEcheance>20150818</DateEcheance>
<Montant>120</Montant>
</Line>
<Line>
<NumeroMensualite>4</NumeroMensualite>
<AnneeEcheance>2015</AnneeEcheance>
<DateEcheance>20150918</DateEcheance>
<Montant>120</Montant>
</Line>
<Line>
<NumeroMensualite>5</NumeroMensualite>
<AnneeEcheance>2016</AnneeEcheance>
<DateEcheance>20151018</DateEcheance>
<Montant>120</Montant>
</Line>
<Line>
<NumeroMensualite>6</NumeroMensualite>
<AnneeEcheance>2016</AnneeEcheance>
<DateEcheance>20151118</DateEcheance>
<Montant>120</Montant>
</Line>
<Line>
<NumeroMensualite>6</NumeroMensualite>
<AnneeEcheance>2016</AnneeEcheance>
<DateEcheance>20151118</DateEcheance>
<Montant>120</Montant>
</Line>
<Line>
<NumeroMensualite>6</NumeroMensualite>
<AnneeEcheance>2017</AnneeEcheance>
<DateEcheance>20151113</DateEcheance>
<Montant>122</Montant>
</Line>
<Line>
<NumeroMensualite>6</NumeroMensualite>
<AnneeEcheance>2017</AnneeEcheance>
<DateEcheance>20151112</DateEcheance>
<Montant>124</Montant>
</Line>
</Lines>
</Mensualite>
</Facture>
And here is the xslfo that i've created:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:set="http://exslt.org/sets" xmlns:exsl="http://exslt.org/common" xmlns:java="http://xml.apache.org/xalan/java">
<xsl:key name="years" match="Mensualite/Lines/Line" use="AnneeEcheance" />
<!-- Start -->
<xsl:template match="/">
<xsl:apply-templates select="exsl:node-set(document(/*/Document))/Facture"/>
</xsl:template>
<xsl:template match="Facture">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<!--Page definitions-->
<fo:layout-master-set>
<fo:simple-page-master master-name="firstPageMaster" page-height="29.7cm" page-width="21cm" margin-top="7mm" margin-bottom="8mm" margin-left="8mm" margin-right="0mm">
<fo:region-body margin-top="23mm" extent="297mm" margin-left="8mm" margin-right="8mm" region-name="body"/>
<fo:region-before extent="23mm" region-name="header1"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="secondPageMaster" page-height="29.7cm" page-width="21cm" margin-top="7mm" margin-bottom="8mm" margin-left="8mm" margin-right="0mm">
<fo:region-body margin-top="26mm" margin-bottom="95mm" extent="255mm" margin-left="8mm" margin-right="8mm" region-name="body"/>
<fo:region-before extent="23mm" region-name="header"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="nextPagesMaster" page-height="29.7cm" page-width="21cm" margin-top="7mm" margin-bottom="8mm" margin-left="8mm" margin-right="0mm">
<fo:region-body margin-top="26mm" extent="255mm" margin-left="8mm" margin-right="8mm" region-name="body"/>
<fo:region-before extent="23mm" region-name="header"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="firstSecondAndRestPages">
<fo:single-page-master-reference master-reference="firstPageMaster"/>
<fo:repeatable-page-master-reference master-reference="nextPagesMaster" maximum-repeats="no-limit"/>
</fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="firstSecondAndRestPages" font-family="Neo Sans Std" font-size="8.5pt" color="&darkGreen;" force-page-count="no-force" initial-page-number="1">
<fo:flow flow-name="body">
<fo:block-container position="fixed" left="10mm" top="86mm" height="30mm" width="186mm" font-size="9pt" color="black" display-align="center">
<fo:table table-layout="fixed" font-size="9pt" width="186mm" space-before="3mm" space-after="1mm">
<fo:table-column column-width="30mm" />
<xsl:if test="count(Mensualite/Lines/Line) > 0"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 1"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 2"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 3"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 4"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 5"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 6"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 7"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 8"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 9"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 10"><fo:table-column column-width="10mm"/></xsl:if>
<xsl:if test="count(Mensualite/Lines/Line) > 11"><fo:table-column column-width="10mm"/></xsl:if>
<fo:table-body>
<fo:table-row font-weight="600" text-align="center">
<fo:table-cell border-bottom="thin solid &darkGreen;" border-right="thin solid &darkGreen;"><fo:block> </fo:block></fo:table-cell>
<xsl:for-each select="Mensualite/Lines/Line[generate-id(.)=generate-id(key('years', AnneeEcheance)[1] ) ]">
<fo:table-cell border-top="thin solid &darkGreen;" border-right="thin solid &darkGreen;" number-columns-spanned="{count(key('years', AnneeEcheance))}"><fo:block><xsl:value-of select="AnneeEcheance"/></fo:block></fo:table-cell>
</xsl:for-each>
</fo:table-row>
<fo:table-row border-bottom="thin solid &darkGreen;" border-top="thin solid &darkGreen;" border-left="thin solid &darkGreen;" border-right="thin solid &darkGreen;">
<fo:table-cell border-right="thin solid &darkGreen;" font-weight="600"><fo:block> Mensualité</fo:block></fo:table-cell>
<xsl:for-each select="key('years', Mensualite/Lines/Line/AnneeEcheance)">
<fo:table-cell border-right="thin solid &darkGreen;"><fo:block><xsl:value-of select="NumeroMensualite"/></fo:block></fo:table-cell>
</xsl:for-each>
</fo:table-row>
<fo:table-row border-bottom="thin solid &darkGreen;" border-top="thin solid &darkGreen;" border-left="thin solid &darkGreen;" border-right="thin solid &darkGreen;">
<fo:table-cell border-right="thin solid &darkGreen;" font-weight="600"><fo:block> Échéance</fo:block></fo:table-cell>
<xsl:for-each select="key('years', Mensualite/Lines/Line/AnneeEcheance)">
<fo:table-cell border-right="thin solid &darkGreen;"><fo:block><xsl:value-of select="concat(substring(DateEcheance,7,2),'/',substring(DateEcheance,5,2))"/></fo:block></fo:table-cell>
</xsl:for-each>
</fo:table-row>
<fo:table-row border-bottom="thin solid &darkGreen;" border-top="thin solid &darkGreen;" border-left="thin solid &darkGreen;" border-right="thin solid &darkGreen;">
<fo:table-cell border-right="thin solid &darkGreen;" font-weight="600"><fo:block> Montant (€)</fo:block></fo:table-cell>
<xsl:for-each select="key('years', Mensualite/Lines/Line/AnneeEcheance)">
<fo:table-cell border-right="thin solid &darkGreen;"><fo:block><xsl:value-of select="Montant"/></fo:block></fo:table-cell>
</xsl:for-each>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:block/>
</fo:block-container>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
I need to split the table if the xml contains more then 12 Lines (columns in that case) and make a new table after.
I'm a bit stuck on it and it's really frustrating. Does anyone have any pointers?
I couldn't understand your XSLT.
To simplify the matter to the question of creating a separate table for every N lines, where each line forms a column, consider the following stylesheet:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="col-limit" select="5" />
<xsl:variable name="rows" select="/Facture/Mensualite/Lines/Line[1]/*" />
<xsl:template match="/Facture">
<root>
<xsl:apply-templates select="Mensualite/Lines/Line[position() mod $col-limit = 1]" />
</root>
</xsl:template>
<xsl:template match="Line">
<xsl:variable name="cols" select=". | following-sibling::Line[position() < $col-limit]"/>
<table border="1">
<xsl:for-each select="$rows">
<xsl:variable name="row" select="position()"/>
<tr>
<th><xsl:value-of select="name()"/></th>
<xsl:apply-templates select="$cols/*[$row]"/>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="Line/*">
<td><xsl:value-of select="."/></td>
</xsl:template>
</xsl:stylesheet>
When applied to your example input, the result (rendered) will be:

XSLT Generate Dynamic Rows and Columns for Apache FOP

For the following xml file, i need to generate an xsl-fo file to be converted into pdf.
I am new to style sheets and struggling to create dynamic table. Please help.
Also, the width for each column varies,based on the column.How would i include this into the code?
The Column Headers and Column Values are dynamically populated in the xml file. Below is a sample.
Can anybody please help in generating xsl-fo or xslt code?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ReportData>
<ColumnHeaders>
<ColumnHeader>
<Name>Col-Header1</Name>
<Width>5</Length>
</ColumnHeader>
<ColumnHeader>
<Name>Col-Header2</Name>
<Width>10</Length>
</ColumnHeader>
<ColumnHeader>
<Name>Col-Header3</Name>
<Width>8</Length>
</ColumnHeader>
</ColumnHeaders>
<Rows>
<Row>
<Column>Row1-Col1</Column>
<Column>Row1-Col2</Column>
<Column>Row1-Col3</Column>
</Row>
<Row>
<Column>Row2-Col1</Column>
<Column>Row2-Col2</Column>
<Column>Row2-Col3</Column>
</Row>
</Rows>
</ReportData>
This should get you started. I used cm for the column width and the page is 11" x 8.5" (landscape) so the table would fit on the page. This should be easy for you to change.
XML Input (fixed to be well-formed)
<ReportData>
<ColumnHeaders>
<ColumnHeader>
<Name>Col-Header1</Name>
<Width>5</Width>
</ColumnHeader>
<ColumnHeader>
<Name>Col-Header2</Name>
<Width>10</Width>
</ColumnHeader>
<ColumnHeader>
<Name>Col-Header3</Name>
<Width>8</Width>
</ColumnHeader>
</ColumnHeaders>
<Rows>
<Row>
<Column>Row1-Col1</Column>
<Column>Row1-Col2</Column>
<Column>Row1-Col3</Column>
</Row>
<Row>
<Column>Row2-Col1</Column>
<Column>Row2-Col2</Column>
<Column>Row2-Col3</Column>
</Row>
</Rows>
</ReportData>
XSLT 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">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page" page-height="8.5in" page-width="11in">
<fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="ReportData">
<fo:table>
<fo:table-header>
<fo:table-row>
<xsl:apply-templates select="ColumnHeaders/ColumnHeader"/>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<xsl:apply-templates select="Rows/Row"/>
</fo:table-body>
</fo:table>
</xsl:template>
<xsl:template match="ColumnHeader">
<fo:table-cell width="{Width}cm" border="solid black 1px" padding="2px" font-weight="bold" text-align="center">
<fo:block><xsl:value-of select="Name"/></fo:block>
</fo:table-cell>
</xsl:template>
<xsl:template match="Row">
<fo:table-row>
<xsl:apply-templates/>
</fo:table-row>
</xsl:template>
<xsl:template match="Column">
<fo:table-cell border="solid black 1px" padding="2px">
<fo:block><xsl:value-of select="."/></fo:block>
</fo:table-cell>
</xsl:template>
</xsl:stylesheet>
XSL-FO Output
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page" page-height="8.5in" page-width="11in">
<fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:table>
<fo:table-header>
<fo:table-row>
<fo:table-cell width="5cm"
border="solid black 1px"
padding="2px"
font-weight="bold"
text-align="center">
<fo:block>Col-Header1</fo:block>
</fo:table-cell>
<fo:table-cell width="10cm"
border="solid black 1px"
padding="2px"
font-weight="bold"
text-align="center">
<fo:block>Col-Header2</fo:block>
</fo:table-cell>
<fo:table-cell width="8cm"
border="solid black 1px"
padding="2px"
font-weight="bold"
text-align="center">
<fo:block>Col-Header3</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell border="solid black 1px" padding="2px">
<fo:block>Row1-Col1</fo:block>
</fo:table-cell>
<fo:table-cell border="solid black 1px" padding="2px">
<fo:block>Row1-Col2</fo:block>
</fo:table-cell>
<fo:table-cell border="solid black 1px" padding="2px">
<fo:block>Row1-Col3</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border="solid black 1px" padding="2px">
<fo:block>Row2-Col1</fo:block>
</fo:table-cell>
<fo:table-cell border="solid black 1px" padding="2px">
<fo:block>Row2-Col2</fo:block>
</fo:table-cell>
<fo:table-cell border="solid black 1px" padding="2px">
<fo:block>Row2-Col3</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
PDF Output

Set maximum block height and trim content

I have a table in an XSL-FO document and in a cell there's an article description, which can easily overflow a page, so I want it to be just cut after reaching a certain height with the cell. Is that possible? This is my example, I tried setting:
height="4cm"
and
block-dimension-progression.maximum="4cm"
but it doesn't work.
<fo:table-row keep-together.within-page="always" height="2cm">
<fo:table-cell border-right="1.5pt solid black">
<fo:block text-align="center">
<xsl:value-of select="count"/>
</fo:block>
</fo:table-cell>
<fo:table-cell border-right="1.5pt solid black" padding-left="2pt">
<fo:block>
<xsl:value-of select="name"/>
</fo:block>
<fo:block font-size="10pt"><xsl:value-of select="manufacturer"/> / <xsl:value-of select="identifier"/></fo:block>
<fo:block font-size="10pt"><xsl:value-of select="description"/></fo:block>
</fo:table-cell>
<fo:table-cell border-right="1.5pt solid black" padding-right="2pt">
<fo:block text-align="right">
<xsl:value-of select="unitprice"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="right">
<xsl:value-of select="totalprice"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
Put the block with the article description in a block-container with overflow="hidden" and the desired height set. Like this:
<fo:block-container overflow="hidden" height="2cm">
<fo:block font-size="10pt">Long description text goes here...</fo:block>
</fo:block-container>