- From: Tony Graham <Tony.Graham@MenteithConsulting.com>
- Date: Wed, 14 May 2008 15:48:33 +0100
- To: www-xsl-fo@w3.org
On Wed, May 14 2008 13:50:02 +0100, jean.stachler@crown.com wrote:
> I have an XML document that will display the elements as shown below.
> Basically, the elements are a subset of the <row> tag. The elements
> will always have the tag names of column1, column2, column3, and column4.
> As shown in the example below, some of the tag names column1, etc. may
> have elements, and some of the tag names for column1, etc. may be empty
> elements. I have only given one listing of empty elements, but this could
> be up to
> 50 empty elements. When creating the PDF document in xslt, is there a way
> of removing
> the empty elements so that they won't display?
> I have the xslt code after the xml detail.
YMMV, but you could try <fo:table-cell empty-cells="hide"> [1] which, if
implemented by your processor, should mean that empty cells don't have
any borders and entirely empty rows don't appear at all.
If you want to omit empty rows (and empty-cells="hide" doesn't work for
you), you could change:
> <xsl:for-each select="header/row">
to:
<xsl:for-each select="header/row[normalize-space()]">
along the lines of the post by Mark Lundquist.
If you went from a "pull" style of selecting what to process to a "push"
style of the document structure determining which template rule is used
then you could go to something like:
------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="1.0">
<xsl:output method="xml"/>
<xsl:template match="/">
<fo:block text-align="left">
<fo:table table-layout="fixed" >
<fo:table-column column-width="15mm"/>
<fo:table-column column-width="20mm"/>
<fo:table-column column-width="14mm"/>
<fo:table-column column-width="50mm"/>
<fo:table-body>
<xsl:apply-templates/>
</fo:table-body>
</fo:table>
</fo:block>
</xsl:template>
<xsl:template match="row">
<fo:table-row border-after-style="double" >
<fo:table-cell xsl:use-attribute-sets="cell-padding"
border="solid black 0.5px" >
<fo:block xsl:use-attribute-sets="detailtablecenter">
<xsl:value-of select="column1"/>
</fo:block>
</fo:table-cell>
<fo:table-cell xsl:use-attribute-sets="cell-padding"
border="solid black 0.5px" >
<fo:block xsl:use-attribute-sets="detailtablecenter">
<xsl:value-of select="column2"/>
</fo:block>
</fo:table-cell>
<fo:table-cell xsl:use-attribute-sets="cell-padding"
border="solid black 0.5px" >
<fo:block xsl:use-attribute-sets="detailtablecenter">
<xsl:value-of select="column3"/>
</fo:block>
</fo:table-cell>
<fo:table-cell xsl:use-attribute-sets="cell-padding"
border="solid black 0.5px" >
<fo:block xsl:use-attribute-sets="detailtableleft">
<xsl:value-of select="column4"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
<xsl:template match="row[not(normalize-space())]"/>
</xsl:stylesheet>
----------------------------------------------------------------------
As always, there's many ways to slice and dice the problem. One of
several ways to also reduce the repetition of the fo:table-cell elements
is using a lookup for attribute values that can differ, e.g.:
------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:crown="http://crown.com"
version="1.0">
<xsl:output method="xml"/>
<crown:align name="column1">center</crown:align>
<crown:align name="column2">center</crown:align>
<crown:align name="column3">center</crown:align>
<crown:align name="column4">left</crown:align>
<xsl:attribute-set name="detailtablealign">
<xsl:attribute name="text-align">
<xsl:value-of
select="document('')/*/crown:align[@name=local-name(current())]"/>
<!-- Define other common attributes here. -->
</xsl:attribute>
</xsl:attribute-set>
<xsl:template match="/">
<fo:block text-align="left">
<fo:table table-layout="fixed" >
<fo:table-column column-width="15mm"/>
<fo:table-column column-width="20mm"/>
<fo:table-column column-width="14mm"/>
<fo:table-column column-width="50mm"/>
<fo:table-body>
<xsl:apply-templates/>
</fo:table-body>
</fo:table>
</fo:block>
</xsl:template>
<xsl:template match="row">
<fo:table-row border-after-style="double" >
<xsl:apply-templates/>
</fo:table-row>
</xsl:template>
<xsl:template match="row[not(normalize-space())]"/>
<xsl:template match="column1 | column2 | column3 | column4">
<fo:table-cell xsl:use-attribute-sets="cell-padding"
border="solid black 0.5px" >
<fo:block xsl:use-attribute-sets="detailtablealign">
<xsl:apply-templates/>
</fo:block>
</fo:table-cell>
</xsl:template>
</xsl:stylesheet>
------------------------------------------------------------
Regards,
Tony Graham Tony.Graham@MenteithConsulting.com
Director W3C XSL FO SG Invited Expert
Menteith Consulting Ltd
XML, XSL and XSLT consulting, programming and training
Registered Office: 13 Kelly's Bay Beach, Skerries, Co. Dublin, Ireland
Registered in Ireland - No. 428599 http://www.menteithconsulting.com
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
xmlroff XSL Formatter http://xmlroff.org
xslide Emacs mode http://www.menteith.com/wiki/xslide
Unicode: A Primer urn:isbn:0-7645-4625-2
[1] http://www.w3.org/TR/xsl11/#empty-cells
Received on Wednesday, 14 May 2008 14:49:23 UTC