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 :

Récupérer un seul Noeud


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Récupérer un seul Noeud
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint">
    	<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
          <xsl:param name="i"/>
     
        <xsl:template match="/|node() | @*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/> 
            </xsl:copy>
        </xsl:template>
            <xsl:template match="w:binData/@w:name">
            <xsl:attribute name="{name()}" namespace="{namespace-uri()}">
                           <xsl:for-each select="//w:binData">
                            <xsl:for-each select="ancestor::w:r">
                    <xsl:for-each select="parent::w:p">
                        <xsl:for-each select="preceding-sibling::w:p[1]">
                            <xsl:for-each select="child::w:r">
                                <xsl:for-each select="w:t">
                                    <p>
                        <xsl:value-of select="translate(.,':','_')"></xsl:value-of>
                                    </p>
     
                                </xsl:for-each>
                            </xsl:for-each>
                    </xsl:for-each>
                </xsl:for-each>
                   </xsl:for-each>
                  </xsl:for-each>
     
            </xsl:attribute>
            </xsl:template>
     
        </xsl:stylesheet>l
    ce code xslt me renvoit le resultat suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <w:binData w:name="Figure 1_ Electronic Document Management SystemFigure 2_ Statuses of CAT 1 and CAT 2 documentsFigure 3_ Statuses of CAT 3 documentsFigure 4_ Standard lifecycle for CAT 1 &amp; CAT 2 documentsFigure 5_ Standard lifecycle for CAT 3 documentsFigure 6_ Legacy / Scanned lifecycleFigure 7_ Review workflow for all categories documentFigure 8_ Approval workflow, parallel with final approverFigure 9_ Periodic Review workflow">
    il me renvoit tous les noeuds
    kk& sait comment faire pour qu'il rebnvoit un seul noeud??
    merci davance

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Ça n'a pas changé depuis la dernière fois : il faut arrêter de faire des select qui commencent par //

    Ton <xsl:for-each select="//w:binData"> non seulement commence par //, ce qu'il ne faut pas faire, mais en plus essaie de sélectionner du w:binData, ce qui est inutile puisque c'est justement le parent du nœud en cours.
    Vire-le.

    Au fait, il vaut mieux se limiter au premier ancestor. Ceci devrait être une expression plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="ancestor::w:r[1]/../../w:p[1]/w:r/w:t">
      <xsl:value-of select="translate(., ':', '_')"/>
    </xsl:for-each>

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    merci
    mais sa me renvoi rien

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    En tout cas, si tu fais un select qui commence par //, ça va forcément te renvoyer tout.
    Le but est donc de sélectionner des choses, mais pas tout. Juste ce qu'on veut. J'essaie de deviner quoi, mais les exemples fournis n'ont jamais permis de le faire.

  5. #5
    Membre actif
    Avatar de VforVincent
    Homme Profil pro
    Doctorant (EPUB 3.0)
    Inscrit en
    Avril 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Doctorant (EPUB 3.0)
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 115
    Points : 265
    Points
    265
    Par défaut
    Je prend le sujet en route (même si j'ai lu les 400 autres sujets sur le même code), mais si nous sommes dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="w:binData/@w:name">
    Et que l'on veut porter un traitement sur w:binData.... ben on est déjà au niveau d'un seul w:binData, non ?! Enfin au niveau de son attribut.

    Ce serait pas mieux de matcher comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="w:binData[@w:name]">
    ?

    Soit il faut que je relise le code XML, parce que je me plante complètement (dans ce cas-là désolé), soit je trouve qu'il y a un peu trop de xsl:for-each...

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par VforVincent Voir le message
    Je prend le sujet en route (même si j'ai lu les 400 autres sujets sur le même code), mais si nous sommes dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="w:binData/@w:name">
    Et que l'on veut porter un traitement sur w:binData.... ben on est déjà au niveau d'un seul w:binData, non ?! Enfin au niveau de son attribut.

    Ce serait pas mieux de matcher comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="w:binData[@w:name]">
    ?
    Il y a plus d'une conversation à ce sujet, mais là le but est de copier tout un document, en changeant la valeur d'un attribut, nommément w:name.

    Dans ce cas-là, je trouve plus pratique de faire un match directement sur l'attribut en question, et d'utiliser <xsl:attribute name="{name()}" namespace="{namespace-uri()}"> pour recréer un attribut de même nom, et indiquer sa nouvelle valeur à l'intérieur.

    On pourrait envisager un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:template match="w:binData[@w:name]">
      <xsl:copy>
        <xsl:for-each select="@*[name() != 'w:name']">
          <xsl:copy/>
        </xsl:for-each>
        <xsl:attribute name="w:name" namespace="{namespace-uri()}">
          <!-- CALCULER NOUVELLE VALEUR ICI -->
        </xsl:attribute>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
    ... Mais bon... Pas des masses pratique, quoi... En plus il y a imbroglio sur les namespaces.

    Citation Envoyé par VforVincent Voir le message
    soit je trouve qu'il y a un peu trop de xsl:for-each...
    Certes. Mais à part un problème de lisibilité, ce n'est pas vraiment ce qui cloche.

  7. #7
    Membre actif
    Avatar de VforVincent
    Homme Profil pro
    Doctorant (EPUB 3.0)
    Inscrit en
    Avril 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Doctorant (EPUB 3.0)
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 115
    Points : 265
    Points
    265
    Par défaut
    Le problème est-il résolu ?

    Si oui : le marquer comme résolu (que le lise pas 18 fois pour rien ).

    Si non il faudrait relancer le sujet, avec un code plus représentatif. Et aussi lier les différents sujets, je ne sais pas si je les ai tous lus, et je ne dois pas être le seul...

Discussions similaires

  1. Récupérer un seul élément d'une string XML
    Par kaygee dans le forum ASP.NET
    Réponses: 5
    Dernier message: 28/04/2009, 20h28
  2. Réponses: 0
    Dernier message: 25/11/2008, 13h58
  3. Réponses: 8
    Dernier message: 23/09/2008, 11h20
  4. [JTree] Récupérer tous les noeuds
    Par DamS2502 dans le forum Composants
    Réponses: 5
    Dernier message: 21/04/2008, 12h13
  5. Récupérer une seule valeur parmi plusieurs
    Par geraldgg dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 11/05/2007, 10h26

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