Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > XML > trying to use xsl:choose to test for last page

Reply
Thread Tools

trying to use xsl:choose to test for last page

 
 
freefly_xml
Guest
Posts: n/a
 
      05-15-2006
I want to test to see if I am on the last page of a document. In this
example it is an invoice. I want to print a different table in REGION
AFTER when I am on the last page. I have tried many variations, no luck
yet. It seems like it should be an easy thing to do with xsl:choose.

Any ideas? Here is one of my attempts.
More detail of what the xml, xsl and pdf look like are here:
http://www.bangboompow.com/xml/invoice/


I am trying to test the field value in the footer area like this:

<xsl:choose>
<xsl:when test="document_end = 'TRUE'">
<fo:block font-size="10pt" font-weight="bold">
LAST PAGE
</fo:block>
</xsl:when>
<xsltherwise>
<fo:block font-size="10pt" font-weight="bold">
not the last page
</fo:block>
</xsltherwise>
</xsl:choose>

I am trying to set the value of the field in the detail line loop like
this:

<xsl:if test="position() = last()">
<xsl:variable name="document_end" select="'TRUE'" />
</xsl:if>

 
Reply With Quote
 
 
 
 
Joe Kesselman
Guest
Posts: n/a
 
      05-15-2006
> <xsl:if test="position() = last()">
> <xsl:variable name="document_end" select="'TRUE'" />
> </xsl:if>


Position doesn't refer to page number, but to position in a set of nodes
returned by an XPath expression.

Nothing in XSLT knows about the concept of "pages" per se.

If the XML language you're working in has a <page> element or something
equivalent to it, you could test for whether you are within the last
such element.

But I presume you're looking for something that will dynamically lay out
the document with an awareness of pagination. That isn't XSLT's job;
that's the sort of thing which the next stage of processing (XSL-FO, for
example) would handle.

--
() ASCII Ribbon Campaign | Joe Kesselman
/\ Stamp out HTML e-mail! | System architexture and kinetic poetry
 
Reply With Quote
 
 
 
 
Andy Dingley
Guest
Posts: n/a
 
      05-16-2006

freefly_xml wrote:
> I want to test to see if I am on the last page of a document.


This is really hard to do in any language remotely like XSLT. The
problem is that XSLT is largely data-centric, not layout-centric. You
need to think of a way of recognising "on the last page" for your
document that can be evaluated simply by looking at the data elements
in the source XML. In many cases this simply isn't possible. Actually
coding the thing as an XPath expression might be the easy bit.

Sometimes, in pathological cases, you have to perform the XML => XSL:FO
transformation (probably by XSLT) first. Once you're into XSL:FO then
you've fixed the layout, implied the page layout and you can start
looking at concepts like page number. Only then can you start
identifying "last page" -- probably by another XSLT identity transform
turning XSL:FO into XSL:FO, but with a minor template rule in there
identifying some condition and making a minor change.

 
Reply With Quote
 
Peter Flynn
Guest
Posts: n/a
 
      05-16-2006
freefly_xml wrote:
> I want to test to see if I am on the last page of a document.


As Joe and Andy have explained, you can't easily do this unless
you are programming within a page-aware formatter. Normally this
kind of thing is handled by the print-formatter stylesheet.

Maybe within your template for Detail_Line you could add at
the end something like

<xsl:if test="not(following-sibling:etail_line)">
stuff to do on last page
</xsl:if>

on the principle that if you're processing the last
Detail_Line, you're probably on the last page...

///Peter
--
XML FAQ: http://xml.silmaril.ie/
 
Reply With Quote
 
freefly_xml
Guest
Posts: n/a
 
      05-16-2006
A working way to create a different footer for the last page of a
document with xslt.

In the looping of the detail lines test for the last line and set a
marker:

<xsl:choose>
<xsl:when test="position() = last()">
<fo:marker marker-class-name="footer-marker">
<fo:block>LAST PAGE</fo:block>
</fo:marker>
</xsl:when>
<xsltherwise>
<fo:marker marker-class-name="footer-marker">
<fo:block>Continued...</fo:block>
</fo:marker>
</xsltherwise>
</xsl:choose>

then retrieve the marker in the region-after with this:

<fo:retrieve-marker retrieve-position="last-ending-within-page"
retrieve-class-name="footer-marker" />

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
test test test richard Computer Support 3 01-24-2007 05:18 AM
TEST TEST Test...Blah Blah Blah generalbatguano@pacbell.net Computer Support 2 09-15-2006 03:47 AM
TEST TEST Test...Blah Blah Blah Generalbatguano@pacbell.net Computer Support 6 09-13-2006 01:53 AM
TEST TEST TEST Gazwad Computer Support 2 09-05-2003 07:32 PM
test test test test test test test Computer Support 2 07-02-2003 06:02 PM



Advertisments