W3C home > Mailing lists > Public > www-xsl-fo@w3.org > February 2010

Re: Table Manipulation

From: Tony Graham <Tony.Graham@MenteithConsulting.com>
Date: Thu, 04 Feb 2010 11:55:28 +0000
To: www-xsl-fo@w3.org
Message-ID: <87ljf9dxlb.fsf@takai.menteithconsulting.com>
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 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Thursday, 4 February 2010 11:56:01 GMT