I am using XSL FO to transform XML data from a file into Tables rendered as PDF document. I am being asked to render empty table structure if no data came in the XML - leaving the table body empty.
I tried the below code
<!-- Addresses -->
<fo:table border="1px solid black" table-layout="fixed" width="100%">
<fo:table-column column-width="2in"/>
<fo:table-column column-width="2in"/>
<fo:table-column column-width="2.5in"/>
<fo:table-column column-width="2.5in"/>
<fo:table-column column-width="2in"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="12pt" font-weight="bold" number-columns-spanned="5" background-color= "#B6B6B4"><fo:block>Addresses</fo:block></fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
<fo:block> Address Type </fo:block>
</fo:table-cell>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
<fo:block> Fields</fo:block>
</fo:table-cell>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
<fo:block> Values </fo:block>
</fo:table-cell>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
<fo:block> Data Source</fo:block>
</fo:table-cell>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
<fo:block> DMC Doc Link</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<xsl:if test="core/clientMembers/address">
<xsl:apply-templates select="core/clientMembers/address"/>
</xsl:if>
<xsl:if test="not(core/clientMembers/address)">
<fo:table-row>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="9pt"><fo:block>Primary Address</fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="9pt"><fo:block>Incorporated Address</fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="9pt"><fo:block>Registered Address</fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border="0.1pt solid black" text-align="left" font-size="9pt"><fo:block>Mailing Address</fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
</fo:table-row>
</xsl:if>
</fo:table-body>
</fo:table>
However this piece of code is not working as expected. Could the experts here pls pls pls advise if there is a way to achieve the desired behavior in XSL FO ??? "core/clientMain/coverage" is xsl template .
It is a bit unclear what you mean by "leaving the table body empty" given the code you're presenting. Certainly I can believe that it doesn't do what you want in the event that the XPath expression core/clientMain/coverage
evaluates to an empty node set, for then it will produce inside the <fo:table-body>
element a single <fo:table-cell>
child element, without any intervening <fo:table-row>
.
I could see you wanting to produce a row of empty cells (apparently five of them to match the five headings) or, alternatively, no row at all, but what you've presented doesn't make sense.
The no row at all case is easy: simply omit the second xsl:if
element and its contents, leaving just
<xsl:if test="core/clientMain/coverage">
<xsl:apply-templates select="core/clientMain/coverage"/>
</xsl:if>
(I presume that that part works as intended when in fact there is data.)
If in fact you want to provide an empty data row, then provide it! Details depend on your specific needs, but it might look like this:
<xsl:if test="core/clientMain/coverage">
<xsl:apply-templates select="core/clientMain/coverage"/>
</xsl:if>
<xsl:if test="not(core/clientMain/coverage)">
<fo:table-row>
<fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
<fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
</fo:table-row>
</xsl:if>