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 :

[XSLT] Création de sous-noeuds


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 4
    Points : 5
    Points
    5
    Par défaut [XSLT] Création de sous-noeuds
    Bonjour,

    Je redébute le XSL après quelques années sans pratique...
    Voici, simplifié, mon XML d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <livre>
    	<page type="page" valeur="aa"/>
    	<page type="page" valeur="bb"/>
    	<page type="separateur" valeur="ff"/>
    	<page type="page" valeur="zz"/>
    	<page type="page" valeur="jj"/>
    	<page type="page" valeur="ll"/>
    	<page type="separateur" valeur="mm"/>
    </livre>
    En fait, j'ai besoin que, dans mon XML de sortie, mes pages soient inclues dans des chapitres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <livre>
    	<chapitre>
    		<page>aa</page>
    		<page>bb</page>
    	</chapitre>
    	<chapitre>
    		<page>zz</page>
    		<page>jj</page>
    		<page>ll</page>
    	</chapitre>
    </livre>
    Mon problème est que mes séparateurs de chapitre sont à la suite des autres pages. Comment faire pour obtenir ce résultat ? J'ai beau cherché, je ne trouve pas. J'ai regardé un peu du côté de la méthode Muench, je ne l'ai pas trop comprise.
    Merci d'avance !

  2. #2
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Tout est affaire de logique en XSLT. L'algo que je vous propose consiste à d'abord repérer la première page de chaque chapitre puis à traiter toutes les pages du même chapitre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      <xsl:template match="/">
       <livre>
        <xsl:for-each select="/livre/page[not(preceding-sibling::*[1][@type='page'])]">
         <chapitre>
          <xsl:variable name="numchap" select="count(preceding-sibling::page[@type='separateur'])"/>
          <xsl:for-each select=" . | following-sibling::page[@type='page' and count(preceding-sibling::page[@type='separateur'])=$numchap]">
           <xsl:copy-of select="."/>
          </xsl:for-each>
         </chapitre>
        </xsl:for-each>
       </livre>
      </xsl:template>
    En terme de temps de traitement, ce n'est pas vraiment optimal mais ça peut peut-être vous suffire... ?
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  3. #3
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    on doit pouvoir faire la même chose avec position()

  4. #4
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Peut-être... Je serais intéressé de voir la solution que vous proposez.
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par alain.couthures Voir le message
    Tout est affaire de logique en XSLT. L'algo que je vous propose consiste à d'abord repérer la première page de chaque chapitre puis à traiter toutes les pages du même chapitre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      <xsl:template match="/">
       <livre>
        <xsl:for-each select="/livre/page[not(preceding-sibling::*[1][@type='page'])]">
         <chapitre>
          <xsl:variable name="numchap" select="count(preceding-sibling::page[@type='separateur'])"/>
          <xsl:for-each select=" . | following-sibling::page[@type='page' and count(preceding-sibling::page[@type='separateur'])=$numchap]">
           <xsl:copy-of select="."/>
          </xsl:for-each>
         </chapitre>
        </xsl:for-each>
       </livre>
      </xsl:template>
    En terme de temps de traitement, ce n'est pas vraiment optimal mais ça peut peut-être vous suffire... ?
    Je reviens à mon problème après l'avoir laissé de côté quelques temps...
    Un grand merci, ça fonctionne bien !

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

Discussions similaires

  1. [XSLT]Trouver un noeud avec une condition sur ses sous-noeuds
    Par enguerran dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 23/02/2007, 11h00
  2. [xslt]Comportement d'un noeud crée dynamiquement
    Par Capt. Flame dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 21/11/2005, 16h10
  3. [XSLT][VARIABLE] comment un noeud est-il stocké?
    Par Devotion dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 02/11/2004, 14h19
  4. Création de sous menus
    Par illusion dans le forum Eclipse Platform
    Réponses: 27
    Dernier message: 27/06/2003, 11h45

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