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 :

[XSL]Probleme fonction recursive


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 166
    Points : 123
    Points
    123
    Par défaut [XSL]Probleme fonction recursive
    Salut a tous,

    j'essaye de recuperer des infos precises d'un fichier xml a l'aide d'une fonction recursive.

    Mon soucis, c'est que la fonction s'appelle indefiniment.

    Voici le fichier xml:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <Row ss:AutoFitHeight="0">
        <Cell ss:MergeAcross="1" ss:StyleID="s29"><Data ss:Type="String">el</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Ρολόγια χειρός</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Κεφαλόφωνα</Data></Cell>
       </Row>
       <Row ss:AutoFitHeight="0">
        <Cell ss:MergeAcross="1" ss:StyleID="s29"><Data ss:Type="String">en</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Wrist watches</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Headphones</Data></Cell>
       </Row>
       <Row ss:AutoFitHeight="0">
        <Cell ss:MergeAcross="1" ss:StyleID="s29"><Data ss:Type="String">es</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Relojes de pulsera</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Auriculares de casco</Data></Cell>
       </Row>
       <Row ss:AutoFitHeight="0">
        <Cell ss:MergeAcross="1" ss:StyleID="s29"><Data ss:Type="String">et</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Käekellad</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Kõrvaklapid</Data></Cell>
       </Row>
       <Row ss:AutoFitHeight="0">
        <Cell ss:MergeAcross="1" ss:StyleID="s29"><Data ss:Type="String">fi</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Rannekellot</Data></Cell>
       </Row>
       <Row>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Indication of the product: </Data></Cell>
        <Cell ss:StyleID="s22"><Data ss:Type="String">Kuulokkeet</Data></Cell>
       </Row>
    et ma fonction xsl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:template name="Titre">
    		<xsl:param name="noeud" select="." />
    		<xsl:if test="string-length($noeud) &gt; 2">
    			<titre>
    					<xsl:value-of select="substring-after($noeud,'Indication of the product:')"/>
    			</titre>	
    			<xsl:call-template name="Titre">
    				<xsl:with-param name="noeud" select="following-sibling::*" />
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
    Premiere appel de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:if test = ". = 'en'">		
    			<titres>
    				<xsl:call-template name="Titre">
    					<xsl:with-param name="noeud" select="following-sibling::*" />
    				</xsl:call-template>
    			</titres>	
    		</xsl:if>

    Je ne trouve pas pourquoi la fonction s'appelle indefiniment et ne passe pas dans le test.


    Edit: je vais quqnd meme un peu expliquer ce que je cherche a faire.
    Je cherche a recuperer les titres en anglais de mon document xml qui a été enregistré à partir d'une feuille excel. Comme vous pouvez le voir il peut y avoir plusieurs langue et le nombre de titre peut varier d'un xml à l'autre.

    Je parcours tous les noeud de mon document xml, et quand je tombe sur le noeud "en", le lance la routine permettant de recuperer les infos.

  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
    Bonjour,

    il n'est pas absolument nécessaire d'écrire une fonction récursive pour sélectionner les Data anglais, il suffit de repérer que chaque changement de langue se fait dans un élément <Row> disposant d'un attribut ss:AutoFitHeight que les autres éléments <Row> (le texte à récupérer) n'ont pas. Une utilisation judicieuse des axes XPath, et le tour est joué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //Data[preceding::Row[@ss:AutoFitHeight][1]/Cell/Data = 'en'][not(ancestor::Row[1][@ss:AutoFitHeight])]
    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
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 166
    Points : 123
    Points
    123
    Par défaut
    mais je t'utilise ou et comment cette ligne parce que lq qvec cette ligne, ne ne trouve aucuns noeuds

  4. #4
    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
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="//Data[preceding::Row[@ss:AutoFitHeight][1]/Cell/Data = 'en'][not(ancestor::Row[1][@ss:AutoFitHeight])]">
    ...
    </xsl:for-each>
    Je l'ai testée avec le XML que tu as donné en exemple, cela fonctionne.
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 166
    Points : 123
    Points
    123
    Par défaut
    bah éoi jai fais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="/">
    		<Patent>
    		  <xsl:for-each select="//Data[preceding::Row[@ss:AutoFitHeight][1]/Cell/Data = 'en'][not(ancestor::Row[1][@ss:AutoFitHeight])]">
    				<titre>test</titre>
    			</xsl:for-each>
    		</Patent>
    	</xsl:template>
    Et test n'affiche jamais. J'ai meme pas les balises titre qui sont affichées oO

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 166
    Points : 123
    Points
    123
    Par défaut
    en mettant cela, j'ai deja quelque chose de mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //ss:Data[preceding::ss:Row[@ss:AutoFitHeight][1]/ss:Cell/ss:Data = 'en'][not(ancestor::ss:Row[1][@ss:AutoFitHeight])]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 166
    Points : 123
    Points
    123
    Par défaut
    Voila mon appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="//ss:Data[preceding::ss:Row[@ss:AutoFitHeight][1]/ss:Cell/ss:Data = 'en'][not(ancestor::ss:Row[1][@ss:AutoFitHeight])]">
    				<titre><xsl:value-of select="."/></titre>
    			</xsl:for-each>
    voila le resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <titre>0#160;</titre>
    	<titre>Wrist watches</titre>
    	<titre>Indication of the product: </titre>
    	<titre>Headphones</titre>
    Bizard non? pourquoie le "0#160;" alors que 2 lignes apres c'est "Indication of the product: " ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 166
    Points : 123
    Points
    123
    Par défaut
    pour l'instant je m'en sors avec des tests et je n'affiche le titre que si il est differents de '0#160;' et de 'Indication of the product: '

    mqis je ne trouve pas ca tres propre.

  9. #9
    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
    Pour ne conserver que les noms de produits, il suffit de ne récupérer que les Data impairs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:for-each select="//ss:Data[preceding::ss:Row[@ss:AutoFitHeight][1]/ss:Cell/ss:Data = 'en'][not(ancestor::ss:Row[1][@ss:AutoFitHeight])]"> 
      <xsl:if test="postion() mod 2 = 1">
        <titre><xsl:value-of select="."/></titre> 
      </xsl:if>
    </xsl:for-each>
    Pour le &#160;, c'est assez curieux...
    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

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 166
    Points : 123
    Points
    123
    Par défaut
    Ok merci, en faisant modulo = 0 je recupere ce que je veux.

    je commence a y voir plus clair a XSL.

    merci!

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

Discussions similaires

  1. probleme avec la fonctions recursive
    Par akkinaj dans le forum Débuter
    Réponses: 2
    Dernier message: 16/07/2008, 12h30
  2. [Syntaxe] Probleme Fonction Recursive C++
    Par selimen dans le forum C++
    Réponses: 6
    Dernier message: 30/05/2007, 15h23
  3. probleme fonction recursive
    Par radouane_as dans le forum C
    Réponses: 11
    Dernier message: 04/05/2007, 21h41
  4. [C#] probleme avec une fonction recursive
    Par K_!!! dans le forum ASP.NET
    Réponses: 2
    Dernier message: 01/08/2006, 18h22
  5. probleme sql, fonction recursive
    Par CaptainChoc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/11/2005, 01h45

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