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 :

[XPATH] following-sibling probleme


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut [XPATH] following-sibling probleme
    bonjour,
    dans mon xsl j ai un doc de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <el style="style"/>
    <autre/>
    <encoreAutre/>
    <el style="style"/>
    <autre/>
    <autre/>
    <autre/>...
    <el style="style"/>
    je souhaite me retrouver avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <el style="style">
      <autre/>
      <encoreAutre/>
    </el>
    <el style="style"/>
      <autre/>
      <autre/>
      <autre/>...
    </el>
    <el style="style"/>
    pour cela j xecute la commande suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:copy-of select="following-sibling::*[generate-id
    (preceding-sibling::*[@style=Style][1]) = generate-id(current())]"/>
    Or tout est décalé, dans mon 1er el je me retrouve avec ceux qui devraient etre avec le 2eme.
    Qq un comprend l erreur? ..en tout cas il y en a une

  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,

    tu as oublié les quotes autour de Style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xsl:copy-of select="following-sibling::*[generate-id 
    (preceding-sibling::*[@style='style'][1]) = generate-id(current())]"/>

  3. #3
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    Désolé j ai oublié de les mettre mais ce n est pas cela.
    Mon vrai template (c est peut etre plus parlant pour certains

    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:template match="*">
    		<xsl:for-each select="//processing-instruction()"><xsl:copy/></xsl:for-each>		
    		<xsl:variable name="currentType">a</xsl:variable>
     
    		<xsl:copy><!--il ne devrait pas y avoir de texte ici donc pas de copie-->
    			<xsl:copy-of select="@*"/>			
    			<!--xsl:for-each select="*[@class=$Styles//@ADelement][1]">
    				<xsl:copy-of select="preceding-sibling::*[name()!=e:Title]"/>
    			</xsl:for-each-->
     
    			<xsl:for-each select="*[@class=$Styles//@ADelement]">
    				<xsl:variable name="pos" select="position()"/>
    				<xsl:variable name="ElementName" select="concat($currentType, $pos)"/>
    				<xsl:element name="{$ElementName}">
    					<xsl:copy-of select="@*"/>
    					<xsl:copy-of select="following-sibling::*[generate-id(preceding-sibling::*[@class=$Styles//@ADelement[1]]) = generate-id(current())]"/>
    				</xsl:element>
    			</xsl:for-each>
    		</xsl:copy>
         </xsl:template>

    $Styles est une variable contenant un doc qui est un ensemble de styles (en xml bien sur)
    je peux envoyer les docs à transformer pour ceux qui veulent essayer.
    J avoue completement sécher sur ce problème...

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    C'est chaud ton truc, mais tu ne copierais pas dans les noeuds suivant(following-sibling) les noeuds précédents(preceding-sibling)?

    Je sais que j'ai voulu une fois utiliser following-sibling, bin j'ai fait autrement. lol

  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
    Ton prédicat positionnel [1] est mal placé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:copy-of select="following-sibling::*[generate-id(preceding-sibling::*[@class=$Styles//@ADelement][1]) = generate-id(current())]"/>

  6. #6
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    oui c est bon...sauf qu il me copie egalement le premier de la liste suivante...

    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
    <a1 class="ADTitle2" id="IDAZA0U" Toc="Yes" Number="&#xA;&#xA;2.1                                                       AERODROME LOCATION INDICATOR AND&#xA;NAME">
    		<x:p class="GENENRTextBodySwedish">
    			<x:strong>
    				<x:span>ESGK–FALKÖPING</x:span>
    			</x:strong>
    		</x:p>
    [color=red]		<x:p class="ADTitle2">
    			<x:span>2.2<x:span>                                                       </x:span>
    			</x:span>
    			<x:span>AERODROME GEOGRAPHICAL AND
    ADMINISTRATIVE DATA</x:span>
    		</x:p>
    		<e:Title/>[/color]
    	</a1>
    	<a2 class="ADTitle2" id="IDAFB0U" Toc="Yes" Number="&#xA;&#xA;2.2                                                       AERODROME GEOGRAPHICAL AND&#xA;ADMINISTRATIVE DATA">
    ....</a2>

  7. #7
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    marche toujours pas...
    mais je crois que mon plus gros problème est que je ne comprend meme pas ce XPATH...
    en particulier la différence entre [] et ()... ou et qd les mettre
    qq un pourrait me renseigner peut être?

    de plus dans mon résultat peut voir que j ai bien ce qu il me faut dans l élément e:AD-2.1 sauf le dernier élément qui ne devrait pas être là car le class="ADTitle2" est contenu ds la varibale $styles//class
    la preuve est que ce meme objet est repris pour construire l élément suivant
    donc le XPATH de GrandFather est presque bon

    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
    	<e:AD-2.1 class="ADTitle2" id="IDAZA0U" Toc="Yes" Number="&#xA;&#xA;2.1                                                       AERODROME LOCATION INDICATOR AND&#xA;NAME">
    		<x:span>2.1<x:span>                                                       </x:span>
    		</x:span>
    		<x:span>AERODROME LOCATION INDICATOR AND
    NAME</x:span>
    					DEBUT COPIE<x:p class="GENENRTextBodySwedish">
    			<x:strong>
    				<x:span>ESGK</x:span>
    			</x:strong>
    		</x:p>
    		<x:p class="ADTitle2">
    			<x:span>2.2<x:span>                                                       </x:span>
    			</x:span>
    			<x:span>AERODROME GEOGRAPHICAL AND
    ADMINISTRATIVE DATA</x:span>
    		</x:p>
    	</e:AD-2.1>
    	<e:AD-2.2 class="ADTitle2" id="IDAFB0U" Toc="Yes" Number="&#xA;&#xA;2.2                                                       AERODROME GEOGRAPHICAL AND&#xA;ADMINISTRATIVE DATA">
    		<x:span>2.2<x:span>                                                       </x:span>
    		</x:span>
    		<x:span>AERODROME GEOGRAPHICAL AND
    ADMINISTRATIVE DATA</x:span>

  8. #8
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    pour simplifier l expression j ai ecrit ceci

    <xsl:variable name="id_noeud" select="generate-id(.)"/>
    <xsl:variable name="id_noeudNext" select="generate-id(following-sibling::*[@class='ADTitle2'][1])"/>
    <xsl:copy-of select="following-sibling::*[preceding-sibling::*[generate-id() = $id_noeudNext]]"/>


    ...ce qui n empeche que j ai toujours le meme element avec class='ADTitle2' dans le nodeset renvoyé...

  9. #9
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    Bon, ... toujours sur le même soucis j ai plusieurs pistes que j arrive à exploiter qu à moitié..
    mon but est de recopier pour chaque element de @class='ADTitle2' tous les éléments suivant AVANT le prochain élément de @class='ADTitle2'

    ...voici ce que j ai écrit et les soucis générés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:copy-of select="following-sibling::*[(@class != 'ADTitle2') and (generate-id(preceding-sibling::*[@class = 'ADTitle2'][1]) = $id_noeud)]"/>
    ce qui pour moi signifie copie des éléments n ayant pas de @class='ADTtile2' suivants l'élément courant et précédent le noeud dont l id du 1er précédent ayant un @class='ADTitle2' est égale à l id courant...
    résultat..rien n est copié...

    apparement cela est du au fait que mes éléments n ont pas forcément un attribut class...
    comment spécifier cela?

  10. #10
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    juste un truc, j'arrive oas a aider car fatiguer Et ou ce code et autre
    Tu pourrais pas faire un xml simplifié, un peu comme dans ta premier question avec simplement les attributs indispensable et les elements qui t'interessent ou te pose pb et un exemple de resultat.
    Dsl mais pas la forme la

  11. #11
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    oui désolé Erwy... je ne me rendais pas compte, je fais ça de suite

Discussions similaires

  1. [XPATH 2.0] following-sibling (again) sur des attributs ?
    Par ThomasEscolan dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/05/2011, 19h00
  2. [XPATH 1.0] Problème utilisation following-sibling
    Par snkorp dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/04/2011, 16h03
  3. [XPath] preceding-sibling plusieurs criteres
    Par tralloc dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/11/2009, 11h28
  4. Utilisation de following-sibling
    Par Laughing Man dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 13/08/2009, 15h59
  5. xpath-->following
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 13/09/2005, 11h51

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