Bonjour,
Je planche sur un problème depuis quelques semaines, je viens sollicité votre aide pour me donner des pistes !
J'aimerais générer un index d'auteurs pour un PDF qui fait une liste de livres.
Je peux avoir plusieurs auteurs pour un même livre.
J'ai pas mal de contraintes sur le XML en entrée (il est généré automatiquement à partir d'un fichier Excel) du coup, j'ai deux configurations de XML possibles :
1- Soit mes auteurs se trouvent dans des noeuds séparés et de nom différents.
(Dans tous les cas les 3 noeuds auteurs existeront mais pourront être vide. Cette config me limite à 3 auteurs possibles.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <Livre> <titre>Exemple de titre</titre> <auteur1>Robert Michel</auteur1> <auteur2>Roland Paul</auteur2> <auteur3></auteur3> <parution>1999</parution> <edition>Castor</edition> </livre>
2- Soit j'écris tous mes auteurs dans un seul noeud et je les sépare par des virgules
(Dans cette config, j'ai un nombre illimité d'auteurs possibles, mais encore faut-il que je séparer les auteurs ensuite pour pouvoir les traiter dans mon index!)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <Livre> <titre>Exemple de titre</titre> <auteurs>Robert Michel,Roland Paul</auteurs> <parution>1999</parution> <edition>Castor</edition> </livre>
Je dois regrouper les auteurs par leur première lettre ex :
Je dois aussi dédoublonner mes auteurs qui sont listés plusieurs fois dans le PDF (ils ne doivent apparaître qu'une fois dans l'index).A
Albert Michel
Alain Francois
Alan Grant
B
Bernard Philippe
Bertrand Jean
C
....
Aujourd'hui, j'y arrive pour un seul noeud et j'utilise un xsl:key de cette manière :
Puis, pour générer mon index j'utilise :
Code : Sélectionner tout - Visualiser dans une fenêtre à part <xsl:key name="PremLettreAuteur" match="auteur1" use="translate(substring(auteur1, 1, 1),'àâäáîïíôöóùûüéèêëçñÀÂÁÅÃÇÉÊÈËÑÓÔÒÕÖÚÛÙÜ','aaaaiiiooouuueeeecnAAAAACEEEENOOOOOUUUU')"/>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <xsl:for-each select="//livre[count(. | key('PremLettreAuteur', translate(substring(auteur1, 1, 1),$strFrom,$strTo))[1]) = 1]"> <xsl:sort select="auteur1"/> <fo:block> <xsl:value-of select="translate(substring(auteur1, 1, 1),$strFrom,$strTo)"/> </fo:block> <xsl:for-each select="key('PremLettreAuteur', translate(substring(auteur1, 1, 1),$strFrom,$strTo))"> <xsl:sort select="auteur1"/> <fo:block> <xsl:apply-templates select="current()[not(preceding::auteur1=auteur1)]" mode="INDEXAUTEURS"/> <!-- La template qui met en page --> </fo:block> </xsl:for-each> </xsl:for-each>
Comment je dois m'y prendre pour inclure d'autres noeud dans mon traitement pour l'index ?
Pour la solution de la liste d'auteurs séparés par des virgules, comment puis-je séparer mes auteurs et les traiter indépendamment ensuite ?
Toute piste me sera très précieuse !
Merci.
Partager