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 :

Exclure le titre du premier paragraphe d'un texte


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    septembre 2016
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Distribution

    Informations forums :
    Inscription : septembre 2016
    Messages : 47
    Points : 43
    Points
    43
    Par défaut Exclure le titre du premier paragraphe d'un texte
    Bonjour,

    Je bute sur un petit problème de transformation XSLT.
    Je transforme un document XML au format DocBook en un document HTML. Je cherche à sélectionner toutes les sections simples db:simplesect d'une section db:section excepté le titre de la première section simple.
    Le but est de transformer ceci :
    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
    <section xml:id="sectionid">
        <title>Titre de la section</title>
        <simplesect>
            <title>Titre 1</title>
            <para>Mon premier paragraphe</para>
        </simplesect>
        <simplesect>
            <title>Titre 2</title>
            <para>Mon deuxième paragraphe</para>
        </simplesect>
        <simplesect>
            <title>Titre 3</title>
            <para>Mon troisième paragraphe</para>
        </simplesect>
    </section>
    en ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <h3>Titre de la section</h3>
     
    <p>Mon premier paragraphe</p>
     
    <h4>Titre 2</h4>
    <p>Mon deuxième paragraphe</p>
     
    <h4>Titre 3</h4>
    <p>Mon troisième paragraphe</p>
    J'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:template match="db:section/db:simplesect">
        <h4><xsl:value-of select="db:title[not(parent::db:simplesect[position()=1])]" /></h4>
        <xsl:apply-templates select="* except db:title" />
    </xsl:template>
    ou ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="db:section/db:simplesect">
    		<xsl:apply-templates select="* except parent::db:simplesect[1]/db:title" />
    	</xsl:template>
    Ca ne fonctionne pas.

    J'ai pensé aussi à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:template match="db:section">
    		<h3><xsl:value-of select="db:title"/></h3>
    		<xsl:apply-templates select="* except db:simplesect[1]/db:title"/>
    	</xsl:template>
    Ca ne fonctionne pas non plus et j'ai même 2 fois le texte du titre de la section.


    Je pense que j'ai un sérieux problème avec la formulation du prédicat.

    Merci de votre aide.
    Vincent

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : septembre 2004
    Messages : 12 383
    Points : 20 966
    Points
    20 966
    Par défaut
    Hello,

    le problème n'est pas dans le prédicat, mais dans la manière de penser.

    Tu penses en termes de "je cherche à sélectionner ceci ou cela".

    Mais non. Tu cherches à transformer les simplesect. Mais dans le cas du premier simplesect tu veux une transformation un peu différente. Dans ce cas-là tu ne veux pas mettre le titre.

    C'est comme ça que ça marche XSLT. Si tu veux sélectionner des trucs, c'est le boulot de XPath et à la rigueur peut-être de XQuery. Mais XSLT ne fonctionne pas comme ça.

    Donc ce que tu veux faire, c'est qu'il y ait un titre ou non, suivant que tu sois ou non dans le premier simplesect.

    Il suffit pour ça d'un simple if test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:if test="position() != 1">
      <h4><xsl:value-of select="db:title"/></h4>
    </xsl:if>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    septembre 2016
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Distribution

    Informations forums :
    Inscription : septembre 2016
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    thelvin,

    Merci pour ton aide. Je me doutais que la réponse était assez triviale.
    Effectivement, j'ai vraiment l'impression de ne pas raisonner de la bonne façon et de mélanger allègrement les rôles de XPATH et de XSLT. Il faut que je prenne le problème dans le bon sens. Pas simple de séparer ces deux outils quand on a l'impression qu'ils sont aussi imbriqués l'un dans l'autre.

    J'ai fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="db:section/db:simplesect">
    		<xsl:if test="position() != 1">
    			<h4><xsl:value-of select="db:title"/></h4>
    		</xsl:if>
    		<xsl:apply-templates select="* except db:title"/>
    	</xsl:template>
    Cela fonctionne très bien.
    Par contre, j'ai du mal à comprendre pourquoi je dois exclure systématiquement les db:title de l'instruction apply-templates. Si je les conserve, je reste avec un affichage du texte des titres en plus des titres transformées par le xsl:value-of dans les balises h4.

    Vincent

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : septembre 2004
    Messages : 12 383
    Points : 20 966
    Points
    20 966
    Par défaut
    Citation Envoyé par aras-vbo Voir le message
    Par contre, j'ai du mal à comprendre pourquoi je dois exclure systématiquement les db:title de l'instruction apply-templates. Si je les conserve, je reste avec un affichage du texte des titres en plus des titres transformées par le xsl:value-of dans les balises h4.
    Errrm...

    Tu pensais que ça faisait quoi d'autre que ça, apply-templates ?

    Tu dois exclure db:title de ton apply-templates, parce que apply-templates sert à appliquer les choses et que tu ne veux pas que les titres que tu as déjà appliqués juste avant soient appliqués une deuxième fois.

    Note que si tu veux raisonner en termes de templates, tu pourrais faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="db:title">
      <h4><xsl:apply-templates/></h4>
    </xsl:template>
    Et l'appeler de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:if test="position() != 1">
      <xsl:apply-templates select="db:title">
    </xsl:if>
    Et si tu ne veux pas faire de select dans tes apply-templates, tu pourrais à la place faire un template dans lequel db:title détecte tout seul s'il doit s'afficher :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="db:title">
      <xsl:if test="position() != 1">
        <h4><xsl:apply-templates/></h4>
      </xsl:if>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Cibler le premier paragraphe
    Par keokaz dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 23/01/2014, 01h54
  2. Solidariser le titre et le paragraphe
    Par Third Joker dans le forum Mise en forme
    Réponses: 19
    Dernier message: 17/08/2013, 15h50
  3. [RegEx] Capturer les 3 premiers paragraphes d'une page HTML
    Par renaud26 dans le forum Langage
    Réponses: 16
    Dernier message: 30/08/2011, 10h59
  4. Réponses: 2
    Dernier message: 29/06/2010, 08h08
  5. Afficher une partie de titre dans un paragraphe
    Par hadjiphp dans le forum Langage
    Réponses: 3
    Dernier message: 22/05/2009, 00h53

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