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 :

Recherche d'attribut et changement le nom de cet attribut (XML -> XML) [XSLT 2.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 54
    Points : 111
    Points
    111
    Par défaut Recherche d'attribut et changement le nom de cet attribut (XML -> XML)
    Bonjour,

    Voilà, nouvellement entré dans le monde de XML et XSLT, je cherche à transformer des fichiers XML pour qu'ils soient compatibles entre différentes versions d'un logiciel les utilisant.
    Je cherche donc à trouver l'attribut "context" dans mon fichier XML (déjà je n'arrive pas à faire ça :/), et je souhaiterais savoir s'il est possible de modifier son nom, que "context" devienne "instance" (la valeur de l'attribut ne changeant pas).
    (Je ne peux pas mettre en dur les parents ou le chemin, puisque tous les fichiers que je vais avoir à traiter sont vraiment différents, et j'en ai plusieurs dizaines)

    Voici le fichier XML d'exemple (j'en ai plusieurs à traiter bien entendu)

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href= "test2.xsl" ?>
    <NC1_OWNSITREP classification="0" context="$" minorVersion="0" urgencyLevel="0">
        <extFunction xmlns="" xmlns:sics="http://atos.net/ns/sics">
            <pipo:objectsSection>
                <NC1_Ground activationStatus="1" context="0" minorVersion="0">
                    <tacticalData xmlns="">
                        <symbolCode>AP456--MP---</symbolCode>
                        <referenceUnitId context="null" id="0:60:0"/>
                    </tacticalData>
                    <location xmlns="">
                        <point>
                            <x>42.80039</x>
                            <y>499.387612</y>
                            <z>21</z>
                        </point>
                        <quality>1</quality>
                    </location>
                </NC1_Ground>
    	</pipo:objectsSection>
        </extFunction>
    </NC1_OWNSITREP>
    J'ai déjà la recopie du texte dans un nouveau fichier, mais c'est tout. Je n'ai pas réussi à ajouter de traitements supplémentaires pour le moment.
    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="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">
        <xsl:output
            method="xml"
            encoding="UTF-8"
            indent="yes" 
        />
        <xsl:template match="/">
            <xsl:result-document method="xml" href="resultat/{tokenize(document-uri(.), '/')[last()]}">
                <xsl:for-each select="node()" >
                    <xsl:copy-of select="current()"/>
                </xsl:for-each>
            </xsl:result-document>
        </xsl:template>  
    </xsl:stylesheet>
    Je vous remercie d'avance pour votre aide et vos explications,

    Cordialement,
    Tahrky.

  2. #2
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    Bonjour
    Je te conseille de te pencher un peu sur le xpath pour comprendre la sélection d'éléments pour la suite si déjà tu ne sais pas sélectionner un élément
    Ensuite cela manque un peu d'indication (ton attribut context est-il toujours associé à NC1_Ground ? on peut le trouver ailleurs ?)

    Dans ton exemple cela donnerai, pour récupérer la valeur de l'attribut context :

    edit : je n'avais pas vu qu'il était également dans la balise root et reference, donc :

    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 54
    Points : 111
    Points
    111
    Par défaut
    Merci pour ta réponse rapide .

    J'ai déjà regardé du côté de XPATH, je dois avouer que tout n'est pas tjr très clair dans ma tête encore, mais j'y arrive en donnant des "chemins absolus" comme tu m'as donné.

    Dans l'exemple que j'ai donné, NC1_OWNSITREP & NC1_Ground ont tous les deux "context" (et referenceUnitId).
    Le problème, c'est que je ne sais pas à l'avance ce que je vais trouver dans les fichiers XML que l'on va me fournir.
    C'est à dire que NC1_OWNSITREP & NC1_Ground sont peut être unique à se fichier, ou vont revenir dans d'autres.
    Je ne le sais pas à l'avance, c'est pourquoi je ne peux pas sélectionner les attributs par un chemin tapé en dur, qui ne fonctionnera finalement que pour ce fichier particulier.

    J'espère avoir mieux répondu à tes questions afin d'obtenir de l'aide .

    EDIT : J'ai vu la modification que tu as fait sur ton poste.
    Serait-il possible de changer la chaine "context" en "instance" du coup ? Je n'ai trouvé sur internet que des modifications de la valeur de l'attribut, mais jamais une modification de l'attribut lui même.

  4. #4
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    tu peux changer le nom de l'attribut en récupérant sa valeur simplement avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
     <xsl:template match="//*/@context">
     	<xsl:attribute name="instance"><xsl:value-of select="."/></xsl:attribute>
     </xsl:template>
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 54
    Points : 111
    Points
    111
    Par défaut
    Merci pour ta réponse !

    J'ai essayé ton code, mais je n'ai aucune modification du XML résultant. Est-ce moi qui ait un problème ?

    Voici mon code XLST

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">
        <xsl:output
            method="xml"
            encoding="UTF-8"
            indent="yes" 
        />
     
        <xsl:template match="/">
            <xsl:result-document method="xml" href="resultat/{tokenize(document-uri(.), '/')[last()]}">
                <xsl:for-each select="node()" >
                    <xsl:copy-of select="current()"/>
                </xsl:for-each>
            </xsl:result-document>
        </xsl:template>  
     
        <xsl:template match="//*/@context">
            <xsl:attribute name="instance"><xsl:value-of select="."/></xsl:attribute>
        </xsl:template>
    </xsl:stylesheet>
    Et je redonne mon XML

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href= "test2.xsl" ?>
    <NC1_OWNSITREP classification="0" context="$" minorVersion="0" urgencyLevel="0">
        <extFunction xmlns="" xmlns:sics="http://atos.net/ns/sics">
            <sics:objectsSection>
                <NC1_Ground activationStatus="1" context="0" minorVersion="0">
                    <tacticalData xmlns="">
                        <symbolCode>AP456--MP---</symbolCode>
                        <referenceUnitId context="null" id="0:60:0"/>
                    </tacticalData>
                    <location xmlns="">
                        <point>
                            <x>42.80039</x>
                            <y>499.387612</y>
                            <z>21</z>
                        </point>
                        <quality>1</quality>
                    </location>
                </NC1_Ground>
    	   </sics:objectsSection>
        </extFunction>
    </NC1_OWNSITREP>

  6. #6
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     <xsl:template match="node()|@*">
      <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
     </xsl:template>
     
     <xsl:template match="//*/@context">
     	<xsl:attribute name="instance"><xsl:value-of select="."/></xsl:attribute>
     </xsl:template>
    Résultat :

    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
     
     
    <NC1_OWNSITREP classification="0" instance="$" minorVersion="0" urgencyLevel="0">
        <extFunction xmlns:sics="http://atos.net/ns/sics">
            <pipo>
                <NC1_Ground activationStatus="1" instance="0" minorVersion="0">
                    <tacticalData>
                        <symbolCode>AP456--MP---</symbolCode>
                        <referenceUnitId instance="null" id="0:60:0"/>
                    </tacticalData>
                    <location>
                        <point>
                            <x>42.80039</x>
                            <y>499.387612</y>
                            <z>21</z>
                        </point>
                        <quality>1</quality>
                    </location>
                </NC1_Ground>
    	</pipo>
        </extFunction>
    </NC1_OWNSITREP>

    (mais le plus important c'est de comprendre le pourquoi du comment... enfin c'est mieux pour la suite)
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 54
    Points : 111
    Points
    111
    Par défaut
    Encore merci pour ton aide !

    Je sélectionne à la racine parce que sans ça, je ne peux pas faire fonctionner l'écriture dans un fichier (en recopiant le nom).
    Cela me débloque grandement d'avoir appris ça, puisque beaucoup de test que je faisais ne changeait absolument rien ...
    Je cherchais effectivement à travailler depuis la racine, mais ma méthode n'était pas la bonne !
    Et ce n'était donc pas forcément les tests que j'écrivais qui n'étaient pas bon, mais l'endroit de départ !

    Merci beaucoup pour ton aide ! J'ai bien compris quel était le problème, je vais pouvoir avancer grâce à toi. Merci encore.

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

Discussions similaires

  1. Changement du nom d'une base de donnée
    Par SILO dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/12/2004, 15h20
  2. Changement de nom de la rubrique UML ? Modélisation ?
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 12
    Dernier message: 14/11/2004, 20h54
  3. [install] changement de nom
    Par ALCINA dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/06/2004, 12h21
  4. changement de nom de fichier avec smartupload
    Par bourvil dans le forum ASP
    Réponses: 2
    Dernier message: 24/05/2004, 14h50
  5. Changement de nom de PC [DEBIAN]
    Par [_Key_Zee__] dans le forum Réseau
    Réponses: 8
    Dernier message: 22/04/2004, 13h09

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