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] probleme de récursivité


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut [XSLT] probleme de récursivité
    bonjour,
    Alain Couthures m'a mis sur la bonne voie il y a 15 jours pour publier un dictionnaire de citations. Je ne parviens cependant pas à régler quelques problèmes de récursivité.

    1. Je ne sais pas comment écrire un template qui s'applique à chacune des formes récupérées dans le tableau php $tab : par exemple pour le verbe donnez je dois appliquer un template à ces trois formes :
    Array ([forme0]=>donnes [forme1]=>donneront [forme3]=>donnerais)
    Actuellement je fonctionne ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <xsl:param name="forme0" />
      <xsl:param name="forme1" />
      <xsl:param name="forme2" />
      <xsl:for-each select="//p[contains(., $forme0 )] ">....</xsl:for-each>
      <xsl:for-each select="//p[contains(., $forme1 )] ">....</xsl:for-each>
    Merci de m'aider à trouver la formule qui puisse alléger le script des redites.

    2. J'ai un second probleme. L'arborescence de mon document xml suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <TeiCorpus.2>
    <auteur>
    <TEI.2>
    <partie><p>blablabla donnez blablabla donnez bla donnai bla</p></partie>
    <partie><p>blablabla donnons blablabla donnons blablabla donne</p></partie>
    </TEI.2></auteur<TeiCorpus.2>
    Mon probleme c'est qu'avec le code actuel je ne récupère qu'une seule citation par partie pour une même forme. Comment rendre la fonction récursive ? J'y ai travaillé avec les ressources des forums etc sans y parvenir;
    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
     
    <xsl:for-each select="//p[contains(., $forme0 )] ">
        <tr><td>
    	<xsl:value-of select="ancestor::auteur/nom"/>
        </td><td><xsl:text>...</xsl:text>
        <xsl:variable name="sbefore" select="substring-before(., $forme0)"/>
        <xsl:choose>
            <xsl:when test="string-length($sbefore) &lt; 50">
              <xsl:value-of select="$sbefore"/>
            </xsl:when>
            <xsl:otherwise>
            <xsl:value-of select="substring($sbefore, string-length($sbefore)-49, 50)"/>
            </xsl:otherwise>
        </xsl:choose>
        </td><td>
        <span style="color:blue"><xsl:value-of select='$forme0' /></span>
        </td><td>
        <xsl:value-of select="substring(substring-after(., $forme0), 1, 50)"/>
        </td></tr>
      </xsl:for-each>
    je vous remercie d'avance pour votre aide.

  2. #2
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Je vais essayer de t'aider mais le problème semble assez flou ...( ou alors ça vient de moi =))

    Pourrais-tu me donner un lien vers le précédent message ou bien encore une explication plus détaillée de ce que tu as et de ce que tu veux pour chaque point ?

    1. Typiquement pour ce point, je n'ai pas compris exactement ce que tu voulais faire, ni même ce que tu avais au départ. Tu dois pouvoir remplacer chaque forme par une autre ?

    2. ICi, tu dis ne récupérer qu'une seule citation par partie ... mais n'est-ce pas ce qui se passe dans le XML que tu fournis ? Tu pourrais détailler fonctionnellement ton problème?

    Merci d'avance, je ferai ce que je peux pour répondre au mieux à ta question
    See you, space cowboy... and if you're satisfied, click on

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    bonsoir et merci pour ta réponse,
    la dernière discussion se trouve là :
    http://www.developpez.net/forums/sho...d.php?t=503123
    commençons par le commencement (question 1).
    au départ j'ai un nuage de tags : avoir, etre, manger, bouger...
    quand l'utilisateur clique sur un de ces tags, je souhaite le rediriger vers l'ensemble des phrases d'un texte ou apparait ce mot sous ses différentes formes : pour le verbe avoir : aurait, avait, eu, avons...
    dans mon fichier php ou j'appelle le xml et le xsl j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $question="SELECT distinct occurrence from dictionnaire where lemme ='$lemme'";
    $requete=mysql_query($question, $connexion);
    $nbocc=mysql_num_rows($requete);
    echo "<br /><h2>Concordances : $freqb occurrences du lemme '<i>$lemme</i>' sous $nbocc formes </h2>";
    	for ($i=0; $i<$nbocc; $i++)
    	{
    	$forme=mysql_result($requete,$i,"occurrence");
    	array_push($tab, ' '.$forme.' ');
    	$tab['forme'.$i]=$tab[$i];
    	unset($tab[$i]);
    	}
    j'obtiens donc un tableau
    Array ([forme0]=>aurait[forme1]=>eu [forme3]=>avons)
    je souhaite appliquer à chaque forme le fichier xsl.
    donc je récupère en entrée du fichier xsl les variables et j'applique un for-each
    <xsl:param name="forme0" />
    <xsl:param name="forme1" />
    <xsl:param name="forme2" />
    <xsl:for-each select="//p[contains(., $forme0 )] ">....</xsl:for-each>
    <xsl:for-each select="//p[contains(., $forme1 )] ">....</xsl:for-each>
    <xsl:for-each select="//p[contains(., $forme2 )] ">....</xsl:for-each>

    C'est trop fastidieux.
    N'y a-t-il pas une possibilité d'incrémenter une variable la concaténer avec $forme et ne faire qu'une seule boucle :
    <xsl:param name="forme0" />
    <xsl:param name="forme1" />
    <xsl:param name="forme2" />
    <xsl:for-each select="//p[contains(., $forme$i )] ">....</xsl:for-each>

    voilà mon premier pb !
    merci d'avance pour ton aide

  4. #4
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Donc, en gros, si je comprend bien, tu références qqpart (en base ?) l'ensemble des déclinaisons d'un de tes tags, les récupères et, après coup, va chercher toutes les citations possédant une de ces formes ?

    Concernant l'optimisation de ton XSL, tu ne voudrais faire qu'un seul parcours ou bien uniquement faciliter le développement de ton XSL ? ... car faire une seule boucle for-each ne veut pas forcément dire que le traitement sera optimisé derrière.

    Je partirai bien vers l'utilisation des apply-templates, très interessants pour ce qui touche à la récursivité et aux parcours d'arbres XML en réalisant des filtres. Tu peux ainsi, par exemple partir sur cette idée :

    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="/">
         <xsl:apply-templates select="//p"/>
    </xsl:template>
    <xsl:template match="p[contains(.,'valeur1_de_la_forme')]">
    ... transformation a appliquer au noeud correspondant ...
    </xsl:template>
    <xsl:template match="p[contains(.,'valeur2_de_la_forme')]">
    ... transformation a appliquer au noeud correspondant ...
    </xsl:template>
    <xsl:template match="p[contains(.,'valeur3_de_la_forme')]">
    ... transformation a appliquer au noeud correspondant ...
    </xsl:template>
    Cette méthode permet de ne faire qu'un seul parcours de ton arbre XML.
    Si les traitements sont identiques pour chaque forme, tu peux donc n'utiliser qu'un seul template pour les balises "p" en limitant la selection au niveau de la balise <xsl:apply-templates>.

    J'espère que ceci t'éclaircit un peu mieux sur les possibilités d'optimisation. Toutefois, si tu souhaitais une autre forme d'optimisation (rendre dynamique les boucles plutôt qu'une écriture "en dur", n'hesites pas à le préciser mais je crois que, le cas échéant, tu vas peut-être devoir passer par une génération dynamique du XSL.

    PS : Vérifier également si une restriction est possible dans le match de xsl:template. Si ça ne fonctionne pas, il faudra passer par une variante avec un seul template sur les balises "p" dans lequel un xsl:choose selectionnera si la balise "p" contient l'une des valeurs possibles (et surtout laquelle).
    See you, space cowboy... and if you're satisfied, click on

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    je voudrais rendre dynamique l'ecriture des templates
    quand je récupère le tableau avec toutes les déclinaisons du verbe avoir, j'ai 50 templates à appliquer pour chaque forme
    $nb=50, $1=a, $2=avez, $3=ont etc...
    c'est pour ca que je voudrais aboutir à un template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//p[contains(., $n)] ">....</xsl:for-each>
    avec $n incrémenté de 0 à $nb
    ce que je n'arrive pas à faire c'est incrémenter le NOM de la variable, passer de $0 à $1 etc...
    suis-je suffisament clair ?

  6. #6
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Oui je comprend bien mais j'ai bien peur que ceci ne soit pas possible "en dur". Une solution à ton problème serait de générer dynamiquement le XSL en fonction de tes occurrences, puis de passer le XML source dans ta moulinette fraîchement créée et qui correspondra à tes besoins.
    See you, space cowboy... and if you're satisfied, click on

Discussions similaires

  1. [XSLT] Probleme récursivité
    Par englandoxford dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 24/03/2010, 09h16
  2. [xslt] probleme de doublons
    Par boudha45 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 06/01/2006, 14h09
  3. [ XSLT ] probleme avec generate-id()
    Par Pi2 dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 02/11/2005, 12h11
  4. [XSLT] probleme pour déclarer css et autre xmlns
    Par enigma dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/07/2005, 12h46
  5. [XSLT] Probleme de selection avec namespaces
    Par Ludo_xml dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 01/06/2005, 14h32

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