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] Encadrer des paragraphes ayant les mêmes balises


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut [XSLT] Encadrer des paragraphes ayant les mêmes balises
    Bon désolé de vous poser une deuxième question mais je viens de me mettre au xsl depuis pas longtemps et j'ai des problèmes assez compliqués à résoudre.

    Je dispose d'un fichier xml comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <p>TITRE 1</p>
    <p>ligne 1</p>
    <p>ligne 2</p>
    <p>TITRE 2<p>
    <p>ligne 1</p>
    <p>TITRE 3</p>
    <p>ligne 1</p>
    <p>ligne 2</p>
    <p>ligne 3</p>
    et je voudrais avoir un xml de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <paragraphe>
       <titre>TITRE 1</titre>
       <donnees>ligne 1</donnees>
       <donnees>ligne 2</donnees>
    </paragraphe>
    etc...

    J'arrive à récupérer les titres et donc à obtenir pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <paragraphe>
        <titre>TITRE 1</titre>
    </paragraphe>
    etc...

    Tout cela en vérifiant avec la condition p[contain(.,'TITRE')]. Le gros problème réside dans la suite, il faudrait que je sélectionne toutes les balises suivantes <p> mais uniquement jusqu'au prochain titre (ou là, je passerai au prochain).

    Le problème vient du fait que toutes les balises sont les mêmes et donc il est difficile de distinguer un nouveau paragraphe (et surtout toutes les lignes associées (et le nombre de lignes peut varier)).

    Voila le casse-tête,

    Si quelqu'un a une idée,

    Billou13

    (si je trouve la réponse, je la poste promis )

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Il y a plusieurs solutions, en voici une (pas forcément la plus performante) :
    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
    	...
    	<xsl:apply-templates select="p[starts-with(., 'TITRE')]"/>
    	...
     
    	<xsl:template match="p">
    		<xsl:variable name="numTitre" select="position()"/>
    		<paragraphe>
    			<titre><xsl:value-of select="."/></titre>
    			<xsl:for-each select="following-sibling::p[count(preceding-sibling::p[starts-with(., 'TITRE')]) = $numTitre and not(starts-with(., 'TITRE'))]">
    				<donnees>
    					<xsl:value-of select="."/>
    				</donnees>
    			</xsl:for-each>
    		</paragraphe>
    	</xsl:template>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Ca fait deux fois que tu me sauves.

    Merci beaucoup à toi.

    Bonne journée,

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    T'avais vu juste sauf sur juste une petit erreur mais bon, sans ton code j'aurais pas trouver.
    <xsl:variable name="numTitre" select="position()"/>

    il faut mettre
    <xsl:variable name="numTitre" select="count(preceding-sibling::p[starts-with(., 'TITRE')])+1"/>

    car la position compte aussi se qui ne comporte pas titre. Et le +1 est pour avoir la position correspondante au nombre que l'on va compter.

    Voila, bonne journée a toi


    Citation Envoyé par GrandFather
    Il y a plusieurs solutions, en voici une (pas forcément la plus performante) :
    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
    	...
    	<xsl:apply-templates select="p[starts-with(., 'TITRE')]"/>
    	...
     
    	<xsl:template match="p">
    		<xsl:variable name="numTitre" select="position()"/>
    		<paragraphe>
    			<titre><xsl:value-of select="."/></titre>
    			<xsl:for-each select="following-sibling::p[count(preceding-sibling::p[starts-with(., 'TITRE')]) = $numTitre and not(starts-with(., 'TITRE'))]">
    				<donnees>
    					<xsl:value-of select="."/>
    				</donnees>
    			</xsl:for-each>
    		</paragraphe>
    	</xsl:template>

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par billou13
    car la position compte aussi se qui ne comporte pas titre.
    Non, si tu utilises la même expression XPath que moi dans le <xsl:apply-templates>, le template "p" ne s'éxécutera que pour les <p> contenant un titre, et position() ne renverra que la position parmi les titres.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Autant pour moi !

    C'est vrai que j'exécute le <apply-template> pour tous. Désolé.
    Résultat, ton code est plus propre que ce que j'ai fait, je change ça ^^

    Bravo à toi alors et merci encore pour cette aide précieuse.

    Bonne fin de journée

  7. #7
    Membre régulier Avatar de Landolsi
    Inscrit en
    Juillet 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 135
    Points : 78
    Points
    78
    Par défaut
    merci pour votre code je cherche moi ça
    Landolsi




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

Discussions similaires

  1. Stocker des tables ayant le même nom
    Par caroleo63 dans le forum Alimentation
    Réponses: 5
    Dernier message: 20/06/2008, 21h15
  2. Problème de Variables ayant les mêmes adresses
    Par danathane dans le forum Débuter
    Réponses: 2
    Dernier message: 09/06/2008, 08h02
  3. [CRXI 2]Des tableaux toujours les mêmes problèmes (quadrillage)
    Par lazarel dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 24/07/2007, 10h04
  4. travaillez sur des élément ayant le même id
    Par pierreonxbox dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/06/2007, 17h29
  5. [XSLT] Normalisation des valeurs pour les URL
    Par camboui dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 10/01/2006, 12h33

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