W3C home > Mailing lists > Public > www-xsl-fo@w3.org > September 2003

Newby help with <fo:flow>

From: Robin Harvey <rh@harrogatesoftware.com>
Date: Mon, 8 Sep 2003 16:51:41 +0100
To: "W3C XSL-FO Mailing list" <www-xsl-fo@w3.org>
Message-ID: <LOEKIAPELMAIBNLNMHEJGELBCGAA.rh@harrogatesoftware.com>

Hi.

I'm new to xsl-fo, and was getting on just fine before i ran in to this
brick wall.  I have a long list of data in XML that i want to format into a
book.  The data needs to flow in 3 columns, and all 3 colunms need to be
broken by headings, like so:

heading 1

1   4   7
2   5   8
3   6

heading 2

1   6   11
2   7   12
3   8   13
4   9   14
5   10

etc.


I've found a way of flowing in 3 columns, but the headings appear in the
columns, like this:

heading1     5       1
   1         6       2
   3         7       3
   4         8       4
   4      heading2

I've tried using separate tables for the headings and the data, with a
number-columns-spanned="3" in the table holding the heading, but it made no
difference.  I also tried using separate rows for the header and the data,
but again it made no difference.
I think what i need to do is have a nested flow within the main
"xsl-region-body" flow, to hold the heading and stop it flowing with the
rest of the data, but i can't find how to do this.  Can someone help me
please?  Is it possible to nest flows within the same document, or am i
missing a trick??  Here is a listing of the xsl stylesheet i am using.  I am
using Sablotron XSLT parser and FOP XSL-FO PDF generator.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <fo:layout-master-set>
    <fo:simple-page-master master-name="data_main"
      page-width="21cm"
      page-height="29.7cm">
      <fo:region-body column-count="3" column-gap="0.3in" margin="1in"/>
      <fo:region-before extent="0.9in"/>
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:page-sequence master-reference="data_main">

    <fo:static-content flow-name="xsl-region-before">
      <fo:block text-align="center" font-family="Times" font-size="10">
        <fo:page-number/>
      </fo:block>
    </fo:static-content>
    <fo:static-content flow-name="xsl-footnote-separator">
      <fo:block>
        <fo:leader leader-pattern="rule" leader-length="100%"
          rule-thickness="0.5pt" color="#007044"/>
      </fo:block>
    </fo:static-content>

    <fo:flow flow-name="xsl-region-body">
      <xsl:for-each select="/root/specialty">
        <!-- THIS TABLE FOR THE HEADER - DOESNT SPAN 3 COLUMNS -->
        <fo:table table-layout="fixed">
          <fo:table-column column-width="136px"/>
          <fo:table-body>
            <fo:table-row>
              <fo:table-cell number-columns-spanned="3"
                border-style="solid">
                <fo:block space-before="18pt"
                  font-family="sans-serif"
                  font-size="16pt"
                  line-height="18pt"
                  text-align="center">
                    <xsl:value-of select="@name"/>
                </fo:block>
              </fo:table-cell>
            </fo:table-row>
          </fo:table-body>
        </fo:table>

        <fo:wrapper text-align="start">
        <fo:table table-layout="fixed">
          <!-- THIS TABLE FOR THE DATA - FLOWS IN 3 COLUMNS OK -->
          <fo:table-column column-width="136px"/>
            <fo:table-body>
              <fo:table-row>
                <fo:table-cell border-style="solid">
                  <xsl:for-each select="consultant">
                    <fo:block space-before="9pt"
                      font-family="sans-serif"
                      font-size="12pt"
                      line-height="16pt"
                      background-color="blue"
                      color="white"
                      text-align="center">
                      <xsl:value-of select="title"/>
                        <xsl:text> </xsl:text>
                      <xsl:if test="fnames != ''">
                        <xsl:value-of select="fnames"/>
                          <xsl:text> </xsl:text>
                      </xsl:if>
                      <xsl:value-of select="snames"/>
                    </fo:block>
                    <fo:block space-before="4pt"
                      font-family="sans-serif"
                      font-size="8pt">
                      Consultant in <xsl:value-of select="spec_desc"/>
                    </fo:block>
                    <xsl:if test= "spec_int != ''">
                      <fo:block space-before="4pt"
                        font-family="sans-serif"
                          font-size="8pt"
                          keep-together.within-column="always">
                        <fo:inline font-style="italic">Special Interests:
                        </fo:inline>
                        <xsl:value-of select="spec_int"/>
                      </fo:block>
                    </xsl:if>
                  </xsl:for-each>
                </fo:table-cell>
              </fo:table-row>
            </fo:table-body>
          </fo:table>
          </fo:wrapper>
      </xsl:for-each>
    </fo:flow>
  </fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>

Thanks in advance for any assistance.

Robin Harvey

p.s. - i've had to make extensive use of <xsl:for-each> because when i used
'external' templates i got name space errors popping up (in sablotron).  Is
there any way of transfering the fo namespace into a second (or third)
template??
Received on Monday, 8 September 2003 12:22:32 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Wednesday, 3 October 2007 16:06:11 GMT