xsl-list
[Top] [All Lists]

Re: Formatting XSL-FO Based on XML Position

2003-12-15 15:58:45
At 2003-12-15 16:50 -0500, Kyle Partridge wrote:
Create fo:table to format some text occurring after a fo:block.

You might be presuming too much too early in the above statement.

The XML input looks like this:

<p tabs="0.2 1.2 2.2">
some text, maybe formatted <b>maybe not</b>, and then:
<tab/>item<tab/>item2<tab/>item3<br/>
<tab/>item4<tab/>item5
</p>

Fine ... but you are describing a "Hard Problem" because you are going from something that is unstructured to something that is structured.

And ... it seems that for all the verbiage you are writing you are failing to explicate the essence of your formatting requirement. This is, I think, because you are trying to describe your XSLT rather than trying to describe your formatting requirement.

First, *before* you figure out what XSLT you want, you have to determine what XSL-FO you want. You don't define the properties of your tab stop attribute value, so I'm guessing these are inches along your line ... and you don't define what happens when your text overflows a tab stop ... so you leave people guessing what it is you want and it isn't fun guessing and getting something wrong, so why would one volunteer a solution only to be shown they are wrong?

Stop looking at your XSLT for now and look at the following:

T:\ftemp>type kyle.fo
<?xml version="1.0" encoding="utf-8"?><!--kyle.fo-->
<root xmlns="http://www.w3.org/1999/XSL/Format";
      font-family="Times" font-size="20pt">

  <layout-master-set>
    <simple-page-master master-name="frame"
                        page-height="297mm" page-width="210mm"
                        margin-top="15mm" margin-bottom="15mm"
                        margin-left="15mm" margin-right="15mm">
      <region-body region-name="frame-body"/>
    </simple-page-master>
  </layout-master-set>

  <page-sequence master-reference="frame">
    <flow flow-name="frame-body">
      <block>
        some text, maybe formatted
        <inline font-weight="bold">maybe not</inline>,
        and then:</block>

      <table>
        <table-column column-width=".2in"/>
        <table-column column-width="1in"/>
        <table-column column-width="1in"/>
        <table-column column-width="1in"/>
        <table-body>
          <table-row>
            <table-cell><block/></table-cell>
            <table-cell><block>item</block></table-cell>
            <table-cell><block>item2</block></table-cell>
            <table-cell><block>item3</block></table-cell>
          </table-row>
          <table-row>
            <table-cell><block/></table-cell>
            <table-cell><block>item4</block></table-cell>
            <table-cell><block>item5</block></table-cell>
          </table-row>
        </table-body>
      </table>
    </flow>
  </page-sequence>
</root>

T:\ftemp>

I've run the above in Antenna House and it looks like it might be what you want. If it isn't what you want, study the XSL-FO semantics and express what you want in XSL-FO until you get a rendering that will satisfy you. Again, I'm not sure you really want to use tables since you haven't described what you want the text to do when it overflows a tab stop: using tables you'll get a wrap; using inline-containers you'll get either clipping or bumped tabs (your choice).

Then ... there is no guessing about what XSL-FO you need for your desired effect, because you are looking at it ... and you have now reduced your problem to one of transformation instead of two (transformation and formatting). This is what I do all the time when I am unsure of the result ... because just jumping into the transformation doesn't help if you don't know into what you are transforming your information.

Now if the above is close to right, perhaps you can see why this is a "Hard Problem" ... you have an unstructured and very flat collection of text and empty elements that are all siblings (the only structure is the <b> child with the text child), and you need to create a hierarchy that has a lot of parent/child relationships (sibling block and table, where table has levels of hierarchy before the low-level table contents).

It can be done, but it isn't pretty ... and it wouldn't be pretty in any language because going uphill in a transformation is a "Hard Problem". BTW, going downhill in a transformation (from rich hierarchy to flat collection) is easy and is the typical transformation most people need to write. What you are trying to do has *long* been around in legacy conversion circles ... going from an unstructured representation of information to a structured representation of information.

When you get the desired XSL-FO output you need, and it doesn't come to you how to write your transformation, then you can post "Here is my XML ... and here is my desired XSL-FO ... and the part of the transformation that I'm having trouble with is the part where ..."

Then it will be easier for people to contribute ... and the easier you make it for people to contribute, the more help you will probably obtain.

I hope this does help.

........................... Ken

--
North America (Washington, DC): 3-day XSLT/2-day XSL-FO 2004-02-09
Instructor-led on-site corporate, government & user group training
for XSLT and XSL-FO world-wide:  please contact us for the details

G. Ken Holman                 mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0    +1(613)489-0999 (F:-0995)
ISBN 0-13-065196-6                       Definitive XSLT and XPath
ISBN 0-13-140374-5                               Definitive XSL-FO
ISBN 1-894049-08-X   Practical Transformation Using XSLT and XPath
ISBN 1-894049-11-X               Practical Formatting Using XSL-FO
Member of the XML Guild of Practitioners:     http://XMLGuild.info
Male Breast Cancer Awareness  http://www.CraneSoftwrights.com/s/bc


XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>