Pour mon souci, c'est bon, c'est réglé également, j'explique quand même :
J'ai un catalogue avec des "modèles". pour chaque modèle, une liste d'articles découlant du modèle, mais avec des specs différentes (taille, type de matériau, etc...).
Mon design de page accepte une liste jusqu'à 20 articles. Admettons maintenant que j'ai un modèle avec 200 articles. Je vais devoir générer un document xsl-fo qui va s'étendre sur plusieurs pages (10 pages). Lorsque j'ai du multi-page, je dois indiquer sur chaque page son index (a, b, c, d, etc...) ainsi qu'une indication visuelle pour que le lecteur se rende compte qu'il y a une page suivante concernant le même modèle.
En gros, mes 10 pages vont avoir des indices "courant" de "a" à "j". Sur les 9 premières pages, je dois afficher dans un coin une petite flèche (en image) qui sert d'indication visuelle, et à sa droite l'indice de la page suivante.
Page 1, j'aurai l'index courant "a", une flèche et l'indice "b" pour la page suivante.
Page 2, j'aurai l'index courant "b", une flèche et l'indice "c" pour la page suivante, etc...
La dernière page, quant à elle, n'aura que l'indice de page courant : "j".
Pour ce faire, j'ai utilisé les balises fo:marker et fo:retrieve-marker.
Dans ma partie "statique", je déclare des balises "fo:retrieve-marker" qui vont s'occuper de récupérer la valeur à inscrire, selon la page :
Code :
- <fo:retrieve-marker retrieve-class-name='index' retrieve-boundary='page' />
- <fo:retrieve-marker retrieve-class-name='next' retrieve-boundary='page'/>
- <fo:retrieve-marker retrieve-class-name='nextIndex' retrieve-boundary='page'/>
|
Mes 3 balises sont configurées pour récupérer la valeur des marqueur "index", "next" et "nextIndex", et ceci pour la page en cours.
Il ne me reste plus qu'a déclarer, sur chaque page, dans le contenu standard (fo:body) les marqueurs adéquats :
exemple pour la première page :
Code :
- <fo:marker marker-class-name='index'>.a</fo:marker>
- <fo:marker marker-class-name='nextIndex'>b</fo:marker>
- <fo:marker marker-class-name='next'>
- <fo:external-graphic src='assets/arrow.png' width='26px' height='13px' content-width='scale-to-fit' content-height='scale-to-fit' />
- </fo:marker>
|
exemple pour la seconde page :
Code :
- <fo:marker marker-class-name='index'>.b</fo:marker>
- <fo:marker marker-class-name='nextIndex'>c</fo:marker>
- <fo:marker marker-class-name='next'>
- <fo:external-graphic src='assets/arrow.png' width='26px' height='13px' content-width='scale-to-fit' content-height='scale-to-fit' />
- </fo:marker>
|
exemple pour la dernière page :
Code :
- <fo:marker marker-class-name='index'>.j</fo:marker>
- <fo:marker marker-class-name='nextIndex'></fo:marker>
- <fo:marker marker-class-name='next'></fo:marker>
|
fop s'occupe de récupérer les données et les afficher correctement, pour chaque page. Il y a peut être un moyen plus propre de le faire, mais je n'ai pas trouvé autre chose, et ça me semblait assez adéquat pour résoudre mon problème.
Quant à ton exemple, voici le code que j'ai utilisé de mon côté (j'ai 2 versions différentes, une version papier et une version online, cette seconde n'ayant pas de différences entre les pages recto et verso :
Code :
- <fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:svg='http://www.w3.org/2000/svg'>
- <fo:layout-master-set>
- <!--
- page-master for recto pages, with specific top/bottom margin
- -->
- <fo:simple-page-master master-name='recto'
- page-height='792px' page-width='1120px'
- margin-top='138px' margin-bottom='98px' margin-left='161px' margin-right='164px'>
- <fo:region-body margin-top='180px' margin-left='376px' margin-right='37px' margin-bottom='145px' />
- <fo:region-before precedence='true' extent='3cm' />
- </fo:simple-page-master>
- <!--
- page-master for verso pages, with specific top/bottom margin
- -->
- <fo:simple-page-master master-name='verso'
- page-height='792px' page-width='1120px'
- margin-top='20px' margin-bottom='216216px' margin-left='161px' margin-right='164px'>
- <fo:region-body margin-top='180px' margin-left='376px' margin-right='37px' margin-bottom='145px' />
- <fo:region-before precedence='true' extent='3cm' />
- </fo:simple-page-master>
- <!--
- page sequence for paper catalog, with alternate top/bottom margin
- WARNING : switch recto/verso position of the article page,
- change odd/even value dynamically on generation
- -->
- <fo:page-sequence-master master-name='papier'>
- <fo:repeatable-page-master-alternatives>
- <fo:conditional-page-master-reference master-reference='recto' odd-or-even='odd' />
- <fo:conditional-page-master-reference master-reference='verso' odd-or-even='even' />
- </fo:repeatable-page-master-alternatives>
- </fo:page-sequence-master>
- <!--
- page sequence for online catalog, with same margin used for each page
- -->
- <fo:page-sequence-master master-name='online'>
- <fo:repeatable-page-master-reference master-reference='recto' />
- </fo:page-sequence-master>
- </fo:layout-master-set>
- <fo:page-sequence master-reference='online' initial-page-number='1'>
- <!--
- declaration of all static elements displayed on each page if multi-paging is required
- contains all visual blocks, excluded the central articles table
- -->
- <fo:static-content flow-name='xsl-region-before'>
- <!--
- here the static content displayed on all pages
- ie : header, logo, footer (better to use "xsl-region-after" static-content tag for footer)
- -->
- </fo:static-content>
- <fo:flow flow-name='xsl-region-body'>
- <!--
- here the dynamic content, use the "break-after='page'" property of block-container
- to pass to next page after the block-container
- -->
- </fo:flow>
- </fo:page-sequence>
- </fo:root>
|
Ensuite, selon que je dois générer le catalogue papier ou le catalogue online, je passe en tant que master-reference le masterName "papier" ou "online" dans la balise fo:page-sequence et le tour est joué.
Je dois encore alterner la valeur odd/even dans les conditions du page-sequence-master "papier", selon que mon article débute sur une page recto ou verso, mais ça c'est un autre problème qui est déjà implémenté dans mon système de génération ;-)
Vala, si ça peut aider quelqu'un tant mieux.
A+