Bonjour,
J'essaie de rédiger un script afin de générer à partir d'une collation d'ouvrage la liste de toutes les signatures.
Exemple de fichier d'entrée:
Résultat souhaité de sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <?xml version="1.0" encoding="UTF-8"?> <xml>A-Z4 Aa-Zz2 AAa-SSs4<xml>
A4
B4
C4
... (etc)
Z4
Aa2
Bb2
... (etc)
Zz2
AAa4
... (etc)
SSs4
Je suis parti de la solution fournie sur ce site en l'adaptant à mes besoins :
http://xmlfr.org/listes/xml-tech/2005/07/0067.html
Pour résumer, j'ai effectué un premier passage pour obtenir l'arbre suivant :
Et voici la XSL modifiée que j'applique et qui me pose problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="collation-to-excel2.xsl"?> <xml> <cahier> <lettre>ã</lettre>-<lettre>ĩ</lettre><nb>4</nb> </cahier> <cahier> <lettre>A</lettre>-<lettre>Z</lettre><nb>4</nb> </cahier> <cahier> <lettre>Aa</lettre>-<lettre>Zz</lettre><nb>4</nb> </cahier> <cahier> <lettre>AAa</lettre>-<lettre>SSs</lettre><nb>4</nb> </cahier> </xml>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:template match="xml"> <xml><xsl:apply-templates/></xml> </xsl:template> <!--Pour créer les signatures--> <xsl:template match="cahier"> <xsl:call-template name="boucle"> <xsl:with-param name="debut"><xsl:value-of select="descendant::lettre[1]"/></xsl:with-param> <xsl:with-param name="fin"><xsl:value-of select="descendant::lettre[last()]"/></xsl:with-param> </xsl:call-template> </xsl:template> <xsl:template name="boucle"> <xsl:param name="debut">ã</xsl:param> <xsl:param name="fin">z</xsl:param> <xsl:param name="lettres">ãẽĩõabcdefghiklmnopqrstvxyz</xsl:param> <cahier><lettre><xsl:value-of select="$debut"/></lettre><nb><xsl:value-of select="descendant::nb[last()]"/></nb><xsl:text> </xsl:text></cahier> <xsl:variable name="position" select="string-length(substring-before($lettres, $debut)) + 1"/> <xsl:variable name="suivant" select="substring($lettres, $position + 1, 1)"/> <xsl:if test="$suivant != '' and $debut != $fin"> <xsl:call-template name="boucle"> <xsl:with-param name="debut" select="$suivant"/> <xsl:with-param name="fin" select="$fin"/> <xsl:with-param name="lettres" select="$lettres"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
Cela fonctionne bien lorsqu'on n'a qu'une lettre mais évidemment pas lorsqu'il y en a plusieurs.
J'ai tenté pas mal de chose (analyse-string, distinguer les unités de $lettres avec des séparateurs, etc) mais je suis bloqué par la syntaxe avec les variables dans la déclaration de la variable position :/
Partager