Les numéros de Page en xsl-fo (et apache fop) avec plusieurs page-séquences
J'ai un document composé de plusieurs sous-documents. Voici comment un sous-document est le suivant:
1 page
2-pages n
Puis vient le sous-document avec la même structure:
1 page
2-m pages
Comme je l'ai dit, les sous-documents sont combinées en une seule .fichier pdf.
Voici mon xsl-fo tempalte:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<fo:root font-size="11pt" font-family="serif">
<fo:layout-master-set>
<fo:simple-page-master master-name="A4-portrait"
page-height="29.7cm" page-width="21.0cm" margin-top="1cm"
margin-left="1.5cm" margin-right="1cm" margin-bottom="1cm">
<fo:region-body />
<fo:region-after region-name="footer" extent="15mm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<!-- first sub-document -->
<fo:page-sequence master-reference="A4-portrait" initial-page-number="1">
...........
<fo:block text-align="center">
Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
</fo:block>
...........
</fo:page-sequence>
<fo:page-sequence master-reference="A4-portrait" id="end">
...........
<fo:block text-align="center">
Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
</fo:block>
...........
</fo:page-sequence>
<!-- second sub-document -->
<fo:page-sequence master-reference="A4-portrait" initial-page-number="1">
...........
<fo:block text-align="center">
Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
</fo:block>
...........
</fo:page-sequence>
<fo:page-sequence master-reference="A4-portrait" id="end">
...........
<fo:block text-align="center">
Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
</fo:block>
...........
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
Donc, j'ai 2 blocs identiques, composé de 2 page-séquences de chacun. Dans mon exemple, disons que le sous-document 1 a 4 pages (n=4) et le sous-document 2 a 2 pages (m=2). Voici les numéros de page que j'obtiens:
1/4
2/4
3/4
4/4
1/4
2/2
Tout est OK, sauf la première page de la deuxième sous-document. À ce point, <fo:page-number-citation-last ref-id="end"/>
renvoie 4, qui est la valeur de la sous-document 1. Ainsi, au lieu de 1/2
, je reçois 1/4
.
Des suggestions comment je peux résoudre ce problème?
- Vous ne montrez pas assez de XSL-FO code fiable pour diagnostiquer le problème. S'il vous plaît ajouter plus de contexte et de moins
.......
. - Pourrait être le problème que j'ai plusieurs éléments avec
id="end"
? - Je ne peux que me répéter: on ne montre pas assez de XSL-FO code fiable pour diagnostiquer le problème. Mais bien sûr, que les Id ne sont pas uniques dans l'ensemble d'un document sont toujours un problème. FOP émet un avertissement parfois si les Identifiants ne sont pas sans ambiguïté.
Vous devez vous connecter pour publier un commentaire.
Sûr. La condition préalable à une référence à un élément XSL-FO est que vous disposez d'un moyen d'identification sans ambiguïté. La meilleure façon de le faire est d'utiliser un
ID
de l'attribut de l'élément que vous souhaitez identifier.Un ID doit être composé de n'importe quelle séquence de caractères alphanumériques et
_
(qui est, sa valeur doit être valide NCName, voir la spécification ici).Vous pouvez taper chaque ID à la main, mais normalement c'est fait avec
xsl:generate-id()
(qui est une fonction de transformation XSLT, pas de XSL-FO).generate-id()
veille automatiquement à ce que les Id sont uniques dans l'ensemble d'un document.Noter que
generate-id()
génère un ID pour le modèle en cours de match ou le nœud en cours de traitement dans une itération dexsl:for-each
.Vous pouvez mettre un ID sur chaque élément dans le fichier XML et en se référant à quelque chose par ID est donc possible pour tout élément XSL-FO.
Puisque vous fournir plus de contexte ici, je vais fournir une plus grande réponse. Il devrait maintenant être clair comment vous pouvez résoudre le problème, mais il est encore difficile de comprendre pourquoi le problème se pose en premier lieu.
La raison pour laquelle les numéros de page sont mal dans votre original de la feuille de style est que dans la première page de la séquence de la deuxième sous-document, vous avez l'intention de se référer à un code qui se produit après vous référer, alors que dans le même temps, les Id ne sont pas uniques dans le document.
En d'autres termes, dans cette séquence de la page:
lorsque vous faites référence à un objet par son ID (
ref-id="end"
), le XSL-FO document est recherché pour un objet avec l'ID qui se produit avant laref-id
. Dès qu'un nœud avec un ID correspondant est trouvé, la recherche se termine et ce nœud est remis àfo:page-number-citation
.Dans ce cas, l'objet avec un ID correspondant survenant avant
ref-id
est une séquence de page de la première sous-document.