- From: Tony Graham <Tony.Graham@MenteithConsulting.com>
- Date: Thu, 04 Feb 2010 11:55:28 +0000
- To: www-xsl-fo@w3.org
On Thu, Feb 04 2010 05:51:26 +0000, anandhthiyagarajan@gmail.com wrote: > Okay i will make you clear. > > Consider the xml > > <node> > <title> > <ingredients> > <name>Category</name> > <name>Noodles</name> > <name>Pizza</name> > </ingredients> > <ingredients> > <ingredient> > <content>Fat</content> > <description>aaaa</description> > </ingredient> > </ingredients> > <ingredients> > <ingredient> > <content>Fat</content> > <description>hgjhgk</description> > </ingredient> > </ingredients> > </title> > </node> > > > Consider the xsl:fo > > <xsl:template match="node/title"> > <fo:block space-before="4mm" hyphenate="true"> > <fo:table table-layout="fixed" width="7in"> > <xsl:for-each select="ingredients/name"> > <fo:table-column column-width="10pt" /> Use proportional-column-width [1]: <fo:table-column column-width="proportional-column-width(1)" /> > </xsl:for-each> > <fo:table-header hyphenate="true"> > <xsl:for-each select="head"> As Aish pointed out, you don't have <head> or <row> elements in your XML. ... > I am attaching the output file > > http://old.nabble.com/file/p27448047/Table.doc Table.doc > > > Hope this would be clear. That does make it clearer, thank you. Your XML doesn't make it easy to achieve what you want since <name> is separate from the rest of the information for an ingredient. To "wrap" (or maybe "split") the table, it would be simplest if you used XSLT 2.0 so you could use xsl:for-each-group [2]. E.g.,: <xsl:template match="node/title"> <xsl:for-each-group select="ingredients[ingredient]" group-starting-with="position() mod 3 = 1"> <fo:table> <!-- There's a "CATEGORY" column in every table. --> <fo:table-column column-width="proportional-column-width(1)" /> <xsl:for-each select="current-group()"> <fo:table-column column-width="proportional-column-width(1)" /> </xsl:for-each> <fo:table-header> <fo:table-row> <fo:table-cell> <!-- Select the "Category" name and convert to upper-case. --> </fo:table-cell> <xsl:for-each select="current-group()"> <fo:table-cell> <!-- Select the appropriate name based on the position of this ingredients among its siblings, not on its position in the current group, then convert to upper-case. --> </fo:table-cell> </xsl:for-each> </fo:table-row> </fo:table-header> <fo:table-body> <!-- "Within the sequence constructor, the context item is the initial item of the relevant group", so this makes one row for each ingredient in the first ingredients in the current group. --> <xsl:for-each select="ingredient"> <xsl:variable name="content-number" select="position()"/> <fo:table-row> <fo:table-cell> <!-- value of content --> </fo:table-cell> <xsl:for-each select="current-group()"> <fo:table-cell> <!-- value of "ingredient[$content-number]/description" --> </fo:table-cell> </xsl:for-each> <fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </xsl:for-each-group> </xsl:template> Regards, Tony Graham Tony.Graham@MenteithConsulting.com Director W3C XSL FO SG Invited Expert Menteith Consulting Ltd XML Guild member 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/#d0e5961 [2] http://www.w3.org/TR/xslt20/#grouping
Received on Thursday, 4 February 2010 11:56:01 UTC