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 :

extraire tous les noeuds entre 2 noeuds avec condition


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut extraire tous les noeuds entre 2 noeuds avec condition
    Bonjour à tous, j’espère que vous allez bien.
    J'ai une petit problème à vous soumettre. J'aimerais extraire tous les nœuds formes du nœud w courant jusqu’à une certaine condition. Je précise que je viens de commencer XSLT et XPath il y a quelques jours.
    Mon fichier xml ressemble à ça (en beaucoup plus gros):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <w><forme>la</forme><lemme>le</lemme><categorie>DETDFS</categorie></w><w><forme>grande</forme><lemme>grand</lemme><categorie>ADJFS</categorie></w><w><forme>douleur</forme><lemme>douleur</lemme><categorie>NCFS</categorie></w><w><forme>du</forme><lemme>du</lemme><categorie>DETDMS</categorie></w><w><forme>père</forme><lemme>père</lemme><categorie>NCMS</categorie></w><w><forme>duchesne</forme><lemme>duchesne</lemme><categorie>NCMS</categorie></w><forme>exemple.</forme><lemme>exemple.</lemme><categorie>NCMS</categorie></w>....
    Mon objectif serait de récupérer la forme du nœud w courant jusqu'à la forme qui contient un point (fin de phrase), ici "exemple." pour ensuite reconstruire la phrase complète.
    Pour l'instant je n'arrive qu'à sélectionner la forme avec le point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    following-sibling::w[contains(forme, '.')][1]/forme
    Dans l'idéal, j'aimerais créer une template récursive pour récupérer l'ensemble des phrases à partir des formes.
    Je n'emploie pas sûrement les bons termes à chaque mais je suis débutant.
    J'ai deja commencé à écrire une template pour cela. Je fais des efforts mais c'est trop dur pour moi.
    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:template name="concat">
      <xsl:param name="liste" />
      <xsl:param name="result" select="''"/>
        <xsl:choose>
          <xsl:when test="$liste">
            <xsl:call-template name="concat">
              <xsl:with-param name="liste" select="$liste[position() &gt; 1]" />
              <xsl:with-param name="result" select="concat($result, ' ', $liste[1])" />
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$result" disable-output-escaping="no" />
          </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Supposons le parent d'un group de w est nommé W qui est le noeud en contexte. On peut construire un template nommé comme ça.
    Code xslt 1.0 : 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:template name="proc">
        <xsl:param name="node" />
        <xsl:param name="result" />
        <xsl:variable name="nodename" select="local-name($node)" />
        <xsl:choose>
            <xsl:when test="$node/forme[not(contains(., '.'))] and $node/following-sibling::*[local-name()">
                <xsl:call-template name="proc">
                    <xsl:with-param name="node" select="$node/following-sibling::*[local-name()=$nodename][1]" />
                    <xsl:with-param name="result" select="concat($result, ' ', normalize-space($node/forme))" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat($result, ' ', normalize-space($node/forme))" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    Il est conçu d'être appelé comme ça.
    Code xslt 1.0 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="W[w]">
        <result>
            <xsl:call-template name="proc">
                <xsl:with-param name="node" select="w[1]" />
                <xsl:with-param name="result" select="''" />
            </xsl:call-template>
        </result>
    </xsl:template>

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut
    Merci pour ton message tsuji. Il y a une chose que je ne comprends pas. C'est la notation W[w] dans le match de la template. Je pensais quil suffisait que je fasse un apply-templates dans ma racine pour que cela marche. Peux-tu m'expliquer ?
    Merci beacoup encore une fois.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Il y a une chose que je ne comprends pas. C'est la notation W[w] dans le match de la template.
    W etant le parent d'un des groupes de w : c'est ce que j'ai supposé et announcé: et W[w] dit un élément W qui contient au moins un w comme enfant. C'est dit exactement ça.

    Je pensais quil suffisait que je fasse un apply-templates dans ma racine pour que cela marche.
    La raison que écrivant un template pour W[w] et un template nommé proc siffit à répondre à la question posée est qu'elle a isolé la fonctionalité demandée tout en laissant un espace très libre pour co-exister avec les autres fonctionalités qu'on a naturellement besoin. C'est de l'art du métier xslt. La programmation xslt est fonctionelle, on peut y avoir beaucoup de templates côte à côte et en même temps tout en faisant leur travail de chacun. Je n'y prononce le moindre possible sur leur écriture et leur existence. Si ce n'est pas maintenant, tu comprendrait un jour dans le futur.

    Pour une seule fonctionalité que pose la question, on peut ajouter un template suivant. Et comme tel, il fonctionne pour cette fin.
    Code xslt 1.0 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="/">
        <results>
            <xsl:apply-templates select="//W[w]" />
        </results>
    </xsl:template>

    Voilà !

Discussions similaires

  1. Trouver tous les chemins entre deux noeuds dans un graphe qui contient des boucles
    Par GayaStudent dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 21/11/2014, 21h31
  2. [JDOM] Problème pour lire les noeuds avec JDOM
    Par Eclix dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 26/05/2014, 18h11
  3. Partage singleton entre tous les noeuds d'un cluster
    Par laruiss dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 12/12/2009, 16h42
  4. Réponses: 0
    Dernier message: 25/11/2008, 13h58
  5. [JTree] Suppresion de tous les noeuds sauf la racine
    Par nicolaskarp dans le forum Composants
    Réponses: 3
    Dernier message: 29/04/2005, 12h53

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