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 :

xsl:for-each item précédent et suivant [XPATH 2.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut xsl:for-each item précédent et suivant
    Bonjour, j'ai le problème suivant en XSL et j'arrive pas à voir comment le résoudre.

    Soit le xml 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
    18
    19
    20
    21
     
    <document>
       <section id="A">
           a a a a a
           <section id="AA">
              AA AA AA AA 
           </section>
           <section id="AB">
              AB AB AB AB 
           </section>
        </section>
        <section id="B">
              b b b b 
        </section>
       <section id="C">
           c c c c
           <section id="CA">
              ca ca ca ca 
           </section>
        </section>
    </document>
    j'ai besoin de générer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     <item id="A" next="AA">a a a a</item>
     <item id="AA" previous="A" next="AB">AA AA AA AA</item>
     <item id="AB" previous="AA" next="B">AB AB AB AB</item>
     <item id="B" previous="AB" next="C">b b b b</item>
     <item id="C" previous="B" next="CA">c c c c</item>
     <item id="CA" previous="C">ca ca ca ca</item>

    Alors, pas de problème pour la partie id, je peux très bien faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="//document//section">
    ....
    </xsl:for-each>
    Mais j'ignore comment, à partir du noeud courant, demander "le noeud précédent dans la liste //document//section", pareil avec le noeud suivant. Si l'architecture n'était pas à plusieurs niveaux, j'aurais utilisé previous-sibling et next-sibling, mais ici ce n'est pas possible en raison de la hierarchie.

    Si quelqu'un a une idée, merci d'avance.
    PS: XSL v2

  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
    Il y a sans doute une manière simple en XPath 2 mais... Je ne connais pas XPath 2 .

    En XPath 1, la solution serait un peu lourde :
    - pour chaque attribut, previous ou next :
    -- faire un choice
    --- dans le cas où il y a un preceding-sibling (respectivement descendant), utiliser ça.
    --- dans le cas où il y a un ancestor (respectivement following-sibling), utiliser ça
    --- dans les autres cas, ne pas mettre l'attribut.

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:choice>
      <xsl:when test="preceding-sibling::section">
        <!-- générer l'attribut-->
      </xsl:when>
      <xsl:when test="ancestor::section">
        <!-- générer l'attribut-->
      </xsl:when>
      <!-- Dans les autres cas, rien -->
    </xsl:choice>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ca résoud pas mon problème, ça suppose que le précédent est un frere ou un parent, hors dans mon exemple, AB n'est ni frere ni parent de B, il est fils d'un frere de B

    edit: apparement, preceding et following sont ce que je cherche.

  4. #4
    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
    Edit :

    Citation Envoyé par tchize_ Voir le message
    edit: apparement, preceding et following sont ce que je cherche.
    Yup. J'étais persuadé qu'ils existaient, mais mes yeux fatigués n'arrivant pas à les trouver, je me suis dit que je m'étais trompé et j'ai réinventé la roue.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    En fait ça résoud pas mon problème.

    Si on prend CA, le previous::, c'est tous les noeuds section jusque B y compris, hors je dois obtenir C

    Je pourrais mettre ancestor:: d'abord, mais alors pour AC j'obtiendrais A et non AB.

    J'ai donc besoin de fusionner les deux axes previous et ancestor afin de prendre le dernier élément du combiné. On fait comment ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    C'est bon, merci des indication. J'avais pas pensé aux axes et je pensais seulement à la liste de xsl:for-each. Comme je suis rouillé en XSLT / XPath, fallu le temps de m'y remettre :p

    Voilà la solution qui combine les axes

    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
    <xsl:stylesheet 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="2.0" >
      <xsl:output indent="yes"/>
      <xsl:template match="/">
        <result>
          <xsl:for-each select="//document//section">
            <item>
              <id><xsl:value-of select="@id"/></id>
              <next><xsl:value-of select="( (following::section)  | (child::section))[1]/@id"/></next>
              <previous><xsl:value-of select="( (preceding::section)  | (ancestor::section))[last()]/@id"/></previous>
            </item>
          </xsl:for-each>
        </result>
    </xsl:template>
    </xsl:stylesheet>
    Et le résultat obtenu:
    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
    <result>
       <item>
          <id>A</id>
          <next>AA</next>
          <previous/>
       </item>
       <item>
          <id>AA</id>
          <next>AB</next>
          <previous>A</previous>
       </item>
       <item>
          <id>AB</id>
          <next>B</next>
          <previous>AA</previous>
       </item>
       <item>
          <id>B</id>
          <next>C</next>
          <previous>AB</previous>
       </item>
       <item>
          <id>C</id>
          <next>CA</next>
          <previous>B</previous>
       </item>
       <item>
          <id>CA</id>
          <next/>
          <previous>C</previous>
       </item>
    </result>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. xsl:for-each avec un parametre pour select
    Par arnog dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/08/2008, 13h09
  2. [XSL] for-each et variable
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 12/01/2006, 11h42
  3. xsl:for-each
    Par ashurai dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 10/01/2006, 11h54
  4. [XSL] for-each + sort, et comparaison current previous value
    Par johan_barbier dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/11/2005, 16h46
  5. [XML/XSL] for-each imbriqués
    Par grome dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/11/2005, 12h44

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