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 :

[XML/XSL] Deplacer une balise / Donner un attribut a une balise


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [XML/XSL] Deplacer une balise / Donner un attribut a une balise
    Bonjour !

    Je suis débutant en XML/XSL et du coup j'ai un peu de mal malgré mes nombreuses recherches sur internet.

    Du coup voila mon problème, j'ai ce code en xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
     
    <BAT>
     
        <BatID>3HLMBQ</BatID>
        <fichier>2017060315.pdf</fichier>
        <status>1</status>
        <commentaire>Validation par mail</commentaire>
        <qui>Test</qui><email/>
        <quand>2017-06-21 12:37:56</quand>
     
    </BAT>
    Je souhaite le passer de cette forme ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <Infos_Commande_MasterPrint>
        <Commande ID= "201705.0078" >
            <DepartBAT>2017-05-09</DepartBAT>
        </Commande>
    </Infos_Commande_MasterPrint>
    J'ai déjà fais ça en XSL :

    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
    56
    57
    58
    59
    60
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output   method="xml"  encoding="UTF-8"  doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system=""  indent="yes" />
     
     
     
    <!-- Recuperer les infos-->  
     <xsl:template match="BAT">
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
     
      <xsl:template match="fichier">
        <xsl:copy-of select="."/>
      </xsl:template>
     
      <xsl:template match="quand">
        <xsl:copy-of select="."/>
      </xsl:template>
     
     
     
    <!-- Modifier les noms -->
        <xsl:template match="quand" priority="1">
         <xsl:element name="DepartBAT">
          <xsl:apply-templates select="@*[name()!='val']|node()"/>
         </xsl:element>
        </xsl:template>
     
        <xsl:template match="BAT" priority="1">
         <xsl:element name="Infos_Commande_MasterPrint">
          <xsl:apply-templates select="@*[name()!='val']|node()"/>
         </xsl:element>
        </xsl:template>
     
         <xsl:template match="fichier" priority="1">
         <xsl:element name="commande">
          <xsl:apply-templates select="@*[name()!='val']|node()"/>
         </xsl:element>
        </xsl:template>
     
     
        <xsl:template match="@*|node()" priority="0">
         <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
         </xsl:copy>
        </xsl:template>
     
     
     
      <!-- Les éléments à ne pas recopier -->
      <xsl:template match="BatID"/>
      <xsl:template match="status"/>
      <xsl:template match="commentaire"/>
      <xsl:template match="qui"/>
      <xsl:template match="email"/>
     
    </xsl:stylesheet>
    Ce qui me donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE Infos_Commande_MasterPrint PUBLIC "-//W3C//DTD HTML 4.01//EN" "">
    <Infos_Commande_MasterPrint>
      <commande>2017060360.pdf</commande>
      <DepartBAT>2017-06-21 10:08:06</DepartBAT>
    </Infos_Commande_MasterPrint>
    Donc voila, j'aimerai bien réussir a déplacer <DepartBAT> dans <commande> ainsi que lui donner en attribut ce qu'elle contient.

    Si c'est possible (j'en demande beaucoup), j'aimerai aussi savoir si il est possible de ne garder que la date dans la balise <DepartBAT> et enlever l'heure.

    Voila si quelqu'un peut m’éclairer il est le bienvenu.

    Thomas

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    D'abord, il n'y a pas de raison sacro-sainte d'avoir toujours les templates présents dans le document xslt du type:
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="e">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    ou des variations de cela. Il est souvent ce qu'on veut mais si ce n'est pas ce qu'on veut, il n'y a pas de raison de l'y mettre et puis, et par conséquence, on est forcé d'utiliser de moyens comme @priority ou d'autre pour le déjouer. Non. C'est peut-être une idée mal ancrée qu'il faudrait défaire.

    La présence de DOCTYPE doit être dictée par la nécessité. Vous y mettez, très bien, mais il me semble la sortie n'est pas du tout html, donc, je dirais c'est plutôt mal conçu et il vaut mieux de ne pas l'y mettre du tout.

    Il faut mentalement contrôler, je dirais, la progression des matches des templates. Ce que vous mettez là, il doit résulter une sortie avec le formatage bizarre à cause des templates sous-entendus, dit défaut, de text()... On peut parfois y remédier avec xsl:strip-space ou des templates void pour supprimer les matches comme il y a plusieurs là, mais c'est symptomatique d'une progression mal conçu...

    Je peux essayer de fournir une version simplissime pourtant arriver le résultat, comme ça.
    Code xslt : 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
    <xsl:output method="xml"  encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <Infos_Command_MasterPrint>
            <xsl:apply-templates select="BAT/fichier" />
        </Infos_Command_MasterPrint>
    </xsl:template>
     
    <xsl:template match="fichier">
        <commande>
            <xsl:apply-templates select="@*[name()!='val']|parent::*/quand" />
        </commande>
    </xsl:template>
     
    <xsl:template match="quand">
        <xsl:element name="DepartBAT">
            <xsl:apply-templates select="@*[name()!='val']"/>
            <xsl:value-of select="substring(normalize-space(), 1, 10)" />
        </xsl:element>
    </xsl:template>
    Je ne sais d'où vient @ID, donc, je préserve la partie de @*[name()!='val'].

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Salut, ce week-end en fouillant un peu j'ai trouvé comment faire et du coup j'ai utilisé ce code la.

    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
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output   method="xml"  encoding="UTF-8"  doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system=""  indent="yes" />
     
     
     
    <!-- Recuperer les infos--> 
    <xsl:template match="BAT">
      <xsl:element name="Infos_Commande_MasterPrint">
        <xsl:element name="Commande">
          <xsl:attribute name="ID">
            <xsl:copy-of select="fichier/text()" />
          </xsl:attribute>
          <xsl:element name="DepartBAT">
            <xsl:copy-of select="substring(quand/text(), 1, 10)" />
          </xsl:element>
        </xsl:element>
      </xsl:element>
    </xsl:template>
     
    </xsl:stylesheet>
    Qui du coup me donne ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE Infos_Commande_MasterPrint PUBLIC "-//W3C//DTD HTML 4.01//EN" "">
    <Infos_Commande_MasterPrint>
      <Commande ID="2017060372.pdf">
        <DepartBAT>2017-06-21</DepartBAT>
      </Commande>
    </Infos_Commande_MasterPrint>

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Bien joué !

    Le doctype me semble un peu fumeux mais bon.

    Pour information tu peux faire un peu plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:template match="BAT">
      <Infos_Commande_MasterPrint>
        <Commande ID="{fichier}">
          <DepartBAT>
            <xsl:value-of select="substring(quand, 1, 10)" />
          </DepartBAT>
        </Commande>
      </Infos_Commande_MasterPrint>
    </xsl:template>
    - Tu n'es pas obligé de mettre des <xsl:element> ou des <xsl:attribute>. Tu peux les mettre tes balises telles quelles directement.
    - Pour les valeurs des attributs, si tu les mets entre { et } ce sera remplacé par l'expression XPath que tu mets dedans.
    - La plupart du temps ça ne sert à rien de sélectionner text(). Si tu prends la valeur d'une balise, ce sera le texte qu'elle contient de toute façon. C'est pour ça que {fichier} dans ID="{fichier}" sera remplacé par le texte de la balise <fichier>
    - copy-of c'est bien quand tu veux copier une balise entière avec tout son contenu. Quand tu cherches juste le texte qu'elle contient, ou si ce n'est même pas une balise que tu copies, il vaut mieux utiliser value-of : la valeur. Ça évitera des erreurs bizarres dans certains cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de ton aide !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/06/2014, 22h52
  2. Réponses: 3
    Dernier message: 14/08/2012, 10h24
  3. [SAX] Problème de récupération d'une valeur dans un attribut d'une balise
    Par Antheadousa dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 10/01/2012, 23h29
  4. [POO] Donner des attributs inconnus aux balises
    Par Boa67 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/02/2009, 13h48
  5. Réponses: 4
    Dernier message: 24/04/2007, 12h14

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