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:
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>
Résultat souhaité de sortie :
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 :

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>
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
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 :/