[xep-support] Re: Getting a page number into a basic-link

From: Michael Sulyaev <msulyaev@renderx.com>
Date: Sat Jan 15 2011 - 01:16:48 PST

On 01/15/2011 06:56 AM, Dave Thomas wrote:> So, in the static-content for the page footer, I have>> <fo:basic-link>> <xsl:attribute name="external-destination">> <xsl:text>url(http://pragprog.com/titles/</xsl:text>> <xsl:value-of select="$book-code"/>> <xsl:text>/errata/add?pdf_page=</xsl:text>> <fo:page-number/>> <xsl:text>)</xsl:text>> </xsl:attribute>> Report erratum on page<fo:page-number/>> </fo:basic-link>>> That doesn't seem to work—I'm getting nothing for the page number> inside the link (but it is displaying correctly in the static text).>> Now, I understand why I can't use<fo:page-number/> in a variable, but> I'm not sure I see why this particular use shouldn't work: isn't the> substitution into the link going to use the same mechanism as the> substitution into the text?>> And, if not—is there any way to do what I'd like to do?
Hello Dave,
Overall, it's a two stage process:1. Transformation: XML + XSL = XSLFO2. Rendering: XSLFO --> PDF
During transformation there is no information about page numbers, because page numbers is one of the results of rendering.
During rendering no XSLTish calculations happen.You request to have a way to alter an fo:basic-link/@external-destination with the value of a page-number received during rendering stage, evolves to the request to alter anything in the input using something from the output, which is clearly and correctly forbidden by the spec.
With XEP there is a way to do what you need, doing some simple manipulation on the XEP Intermediate Format. The idea is to alter the url using the current page number as written in it's parent xep:page element. You'll understand everything from the command line and files below:

$ cat erratum.fo \ | ./xep -fo - -xep - 2>/dev/null \ | xsltproc patch-erratum-url.xsl - \ | ./xep -xep - -pdf erratum.pdf 2>/dev/null
$ cat erratum.fo<?xml version="1.0" encoding="utf-8"?><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="all-pages"> <fo:region-body region-name="xsl-region-body" margin="0.7in"/> <fo:region-after region-name="xsl-region-after" extent="0.7in" display-align="before" padding="6pt 0.7in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="all-pages" initial-page-number="2011"> <fo:static-content flow-name="xsl-region-after"> <fo:block> <fo:basic-link external-destination="url(http://pragprog.com/titles/book-code/errata/add?pdf_page=)"> Report erratum on page <fo:page-number/>. </fo:basic-link> </fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block>hello erratum, this is page <fo:page-number/> </fo:block> </fo:flow> </fo:page-sequence></fo:root>
$ cat patch-erratum-url.xsl<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="1.0" xmlns:xep="http://www.renderx.com/XEP/xep" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="xep:external-link/@destination[.='http://pragprog.com/titles/book-code/errata/add?pdf_page=']"> <xsl:attribute name="destination"> <xsl:text>http://pragprog.com/titles/book-code/errata/add?pdf_page=</xsl:text> <xsl:value-of select="../../@page-id"/> </xsl:attribute> </xsl:template></xsl:stylesheet>
Of course, post-processing of this kind may be implemented in different ways, including Java integration of XEP. I just love pipes.
Regards,Michael SulyaevRenderX_______________________________________________(*) To unsubscribe, please visit http://lists.renderx.com/mailman/options/xep-support(*) By using the Service, you expressly agree to these Terms of Service http://www.renderx.com/terms-of-service.html
Received on Sat Jan 15 01:16:58 2011

This archive was generated by hypermail 2.1.8 : Sat Jan 15 2011 - 01:17:07 PST