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] Copie partielle de noeud selon certain critère


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 52
    Points
    52
    Par défaut [XSLT] Copie partielle de noeud selon certain critère
    Bonjour à tous,

    je suis en ce moment dans une impasse....

    Je cherche a copier certains element d'un fichier xml, qui contiennent un ensemble de lettre...

    voici un exemple rapide...

    voici le fichier xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0"  ?>
    <?xml-stylesheet href="monfichier.xsl" type="text/xsl" ?>
    <a>
    <ab x="x"><b>Test</b><a>z</a></ab>
    <z x="x"><a>z</a></z>
    </a>
    et voici ou j'en suis rendu....

    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="xml" version="1.0" indent="yes" encoding="ISO-8859-1"/>
     
    <xsl:template match="*">
      <xsl:copy>
        <xsl:apply-templates select="*"/>
      </xsl:copy>
    </xsl:template>
     
    <xsl:template match="xml">
      <xsl:if test="contains(name(.),'a')">
     
      </xsl:if>
    </xsl:template>
     
    </xsl:stylesheet>
    Dans cet exemple, tout les element contenant la lettre A dans leurs nom devront etre copier, en omettant ceux qui ne contiennent pas la lettre a (par exemple la balise z)

    J'ai aussi essayé avec <xsl:element> mais toujours sans succès...

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="xml">
    tu n'as de balise dont le nom est xml ta template ne veut donc rien dire

    De plus ,copier la balise qui contient a, qu'est ce que cela veut dire ?
    ta balise racine a en fait partie, doit-on copier tout son contenu, c'est a dire toutes les autres balises qu'elle contient ....

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 52
    Points
    52
    Par défaut
    En effet... la partie avec xml, j'était presque en désespoir, et j'ai essayer plein de trucs... et c'était probablement le dernier...

    pour ce qui est des balises.... on doit copier seulement la balise, ces arguments, et les noeuds de texte qu'elle contient...

    par exemple...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <a>
    <b>
    <a test="untest">
    <z>
    <abababa>un autre test</abababa>
    </z>
    </a>
    </b>
    </a>
    devrait donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <a>
    <a test="untest">
    <abababa>un autre test</abababa>
    </a>
    </a>

    et pour être bien honnête... je ne cherche pas vraiment la réponse totale du problème, mais surtout une piste.... car je dois vous avouer que ceci fait parti d'un travail scolaire a remettre... et avoir une réponse complète n'aiderais en rien mon apprentissage.... mais j'ai passé plus de 5 heures à tourner autour de ce problème, et je suis convaincu que je passe a coté d'un détail anodin...

  4. #4
    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
    ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="*">
      <xsl:copy>
        <xsl:apply-templates select="*"/>
      </xsl:copy>
    </xsl:template>
    Le match n'est pas bon, disons qu'avec un certain predicat (qui n'a rien à faire dans un xsl:if)ce serait mieux, et que un template avec un match="*" avec le apply mais sans le copy pourrait t'être utile

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 52
    Points
    52
    Par défaut
    Bon... j'y suis presque....


    voici ou j'en suis rendu....

    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="xml" version="1.0" indent="yes" encoding="ISO-8859-1"/>
     
    <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates select="//*[contains(name(.),'a')]" />
    </xsl:copy>
    </xsl:template>
     
     
     
    <xsl:template match="*">
     
     
      <xsl:copy>
      <xsl:copy-of select="@*"/>
     
      <xsl:if test="count(descendant::*) = 0">
          <xsl:value-of select="." />
      </xsl:if>
      </xsl:copy>
    </xsl:template>
     
    </xsl:stylesheet>
    le trouble c'est que la balise contenu dans la balise <z> (celle du debut) ne devrait pas etre affichee....

    j'en suis encore a une autre impasse....

    mais bon... j'y arrive presque...

    en passant merci de vos aides precieuses

  6. #6
    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
    Tu pars sur des pistes bien trop complexe

    Il faut imaginer XSLT comme un enfant qui s'amuse à mettre des objets dans des formes (carré, rond , triangle), il essaiera de trouver la forme la plus exact dans la liste que tu lui donnes.
    le xsl-apply-templates c'est la listes des objts que tu lui donne , le match de tes templates c'est la forme du trou.
    Ce que tu dois t'assurer sur chaque noeud, c'est qu'il va bien aller chercher ses fils.
    Après tu différencie le traitement si le nom contient a ou non, pas plus complexe que ça

    ton squelette va ressembler à ça

    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="xml" version="1.0" indent="yes" encoding="ISO-8859-1"/>
     
    <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
    </xsl:template>
     
    <xsl:template match="*">
    [..]
     </xsl:template>
     <xsl:template match="*[contains(name(),'a')]">
    [..]
     </xsl:template>
     
    </xsl:stylesheet>

Discussions similaires

  1. [Batch] Récupérer tous les fichiers selon certains critères
    Par Mistic100 dans le forum Scripts/Batch
    Réponses: 16
    Dernier message: 27/07/2009, 01h20
  2. [XL-2000] Modifier une cellule selon certains critères
    Par Nicolas Plan dans le forum Excel
    Réponses: 2
    Dernier message: 28/04/2009, 10h18
  3. Redirection de Page en javascript selon certains critères
    Par Anthonyyy dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 12/03/2009, 20h08
  4. Sélection de lignes selon certains critères
    Par gangsterus dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/10/2007, 00h01
  5. [XSLT]copie partielle avec condition sur les axes
    Par MasterOfChakhaL dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 13/10/2006, 19h15

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