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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    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
    Par défaut
    merci
    mais sa me renvoi rien

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expérimenté
    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
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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