IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

Variable incrémentée (Oui mais ;) ) [Sources]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 11
    Par défaut Variable incrémentée (Oui mais ;) )
    Hello,

    Je sais d'ores-et-déjà qu'une variable ne peut être incrémentée en XSL mais j'ai quand même besoin de quelque chose d'approchant. Ou alors ce que je veux n'est tout simplement pas possible, dîtes moi.

    Voici mon cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <Table>
    <Row>
    <Cell/>
    <Cell index="34"/>
    <Cell/>
    </Row>
    <Row>
    <Cell/>
    <Cell/>
    </Row>
    </Table>
    Pour chaque balise, Row je cherche à connaitre le dernier index. L'index est claculé comme suit :
    -Si cell est vide, index est incrémenté de 1
    -Si Cell a un index, l'index devient cette valeur

    Par exemple dans le premier Row, l'index serait de 35 (1, puis 34, puis 34+1). Dans le deuxième Row, l'index serait de 2 (1+1).

    Je dois récupérer l'index pour CHAQUE Row. Je ne peux donc pas appliquer un template global de type match="Row" (Si ?). En effet, l'idée c'est de comparer cet index avec une valeur définie et d'ajouter un certain nombre d'éléments basé sur la différence. Par exemple si le nombre final attendu est 45, j'ajouterai 10 élements au premier ROW (45-35) mais 43 au deuxième (45-2).

    De même position() ne m'est d'aucun secours car il ne renvoie pas la valeur exacte. Avoir deux noeuds Cell ne signifie pas que l'index est 2. Par exemple:
    <Cell index="100"/>
    position() me renvoie 1. Or j'ai besoin de connaître 100. Evidemment il ne s'agit pas de faire Cell/@index car comme dit plus haut, c'est plus un calcul incrementiel.

    Est-ce clair ?

    j'ai tenté un template récursif mais comment puis-je à la fois parcourir toutes mes cellules avec un for-each et lancer une récursivité qui par défaut va vouloir re parcourir les cellules ?

    Là je suis franchement bloqué :S

    Tout éclairage sera le bienvenu

    Merci d'avance,

    Loic

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Personnellement je ne m'embarrasserais pas à compter moi-même :

    Trouver la dernière Cell de la Row qui a un index explicite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="lastExplicit" select="Cell[@index][last()]"/>
    Ensuite, s'il y en avait une, ajouter à son @index un count() qui compte tous ses following-sibling.
    S'il n'y avait pas d'index explicite, l'index est directement un count(Cell).

    Toutefois, il est effectivement possible de compter soi-même avec un template récursif. Il suffit d'y passer 3 paramètres :
    - Le <Row> pour lequel on est en train de compter
    - L'index actuel (commencer à zéro)
    - Le position() du prochain Cell à compter (commencer à 1 et incrémenter à chaque appel.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 11
    Par défaut
    Hello,

    Super, ca m'aide beaucoup.

    Par contre, je m'y prends mal mais si j'essaye d'afficher la valeur, ca ne m'affiche rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <info_add>LAST INDEX (<xsl:value-of select="Cell[@ss:Index][last()]"/>)</info_add>
    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
     
       <Row ss:AutoFitHeight="0" ss:StyleID="s66">
        <Cell><Data ss:Type="Number">1234</Data></Cell>
        <Cell><Data ss:Type="String">foo</Data></Cell>
        <Cell ss:StyleID="s67"><Data ss:Type="Number">1</Data></Cell>
        <Cell ss:StyleID="s67"><Data ss:Type="Number">1</Data></Cell>
        <Cell><Data ss:Type="Number">10</Data></Cell>
        <Cell><Data ss:Type="Number">10</Data></Cell>
        <Cell ss:Index="11" ss:StyleID="s68"><Data ss:Type="String">A</Data></Cell>
        <Cell ss:StyleID="s68"><Data ss:Type="Number">0</Data></Cell>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
       </Row>
    Ici je devrai obtenir 27 mais je n'ai pas la valeur :S

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <xsl:variable name="index">
                                                                                                   <xsl:choose>
                                                                                                       <xsl:when test="Cell[@ss:Index][last()] != '' ">
                                                                                                           <xsl:variable name="lastExplicit" select="Cell[@ss:Index][last()]"/>
                                                                                                           <xsl:variable name="children" select="count(following-sibling::Cell[@ss:Index][last()])"/>
                                                                                                             <xsl:value-of select="$lastExplicit - $children"/>
                                                                                                       </xsl:when>
                                                                                                       <xsl:otherwise>
                                                                                                           <xsl:value-of select="count(ss:Cell)"/>
                                                                                                       </xsl:otherwise>
                                                                                                   </xsl:choose> 
    						        </xsl:variable>
    Une idée d'où je m'y prends mal ?

    Merci d'avance,

    Loic

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 11
    Par défaut
    Hello,
    J'avais un problème de namespace sur Cell. Maintenant j'ai donc bien le dernier item à posseder un attribut index, mais je bloque sur le décompte des éléments suivants.
    J'ai essayé pleins de trucs à partir de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    count(following-sibling::ss:Cell[@ss:Index][last()])
    Mais rien n'y fait
    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
     
        <Cell ss:Index="11"></Cell>
        <Cell ss:StyleID="s68"></Cell>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
        <Cell ss:StyleID="s68"/>
    Je n'arrive pas à compter les Cell vides :S

    Une idée ? Merci encore.

    Loic

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Obtenir lastExplicit comme je l'ai déjà montré.

    S'il existe, le décompte est obtenu avec le XPath :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lastExplicit/@index + count($lastExplicit/following-sibling::ss:Cell)
    S'il n'y en avait pas, juste :

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 11
    Par défaut
    Hello,

    Merci beaucoup thelvin, tu m'es d'un grand secours. Je ne fais de l'XSl qu'une fois par an, j'ai toujours un peu de mal à dérouiller la machine

    Ok, j'avais pas compris qu'avec
    J'avais une référence à " l'objet " node. Du coup ça fait sens.

    Dernier truc, j'essaye donc d'ajouter le nombre de nodes compris entre $lastExplicit et le noeud actuel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Cell ss:Index="3"/>
    <Cell/>
    <Cell/>
    <Cell ss:Index="12"/>
    Ma logique est de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:variable name="currentPosition" select="position()"/>
    <xsl:value-of select="count(ss:Cell[position()>$lastExplicit and position()"/><$currentPosition])
    En gros, récupérer la position de lastExplicit et celle du neoud actif et de compter les noeuds ss:Cell entre ces deux bornes.
    MAIS aucune des deux formulations ne fonctionnent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $lastExplicit[position()]
    $lastExplicit/position()
    alors que je peux accéder à leurs attributs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lastExplicit/@ss:Index
    Comment récupérer la position de $lastExplicit ?

    Merci d'avance,

    Loic

Discussions similaires

  1. incrémentation oui mais comment
    Par reg34000 dans le forum Langage
    Réponses: 5
    Dernier message: 20/03/2013, 18h51
  2. Réponses: 2
    Dernier message: 03/03/2005, 23h23
  3. Création de logiciel, oui, mais quelle base de donnée ?
    Par Acti dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 17/02/2005, 12h41
  4. HomeDB, oui mais comment ?
    Par Gregouz dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 27/10/2004, 15h27
  5. [APPLET-SERVLET] download oui mais upload non ...
    Par meufeu dans le forum Applets
    Réponses: 7
    Dernier message: 09/08/2004, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo