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

  1. #1
    Candidat au Club
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    juillet 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique

    Informations forums :
    Inscription : juillet 2019
    Messages : 3
    Points : 2
    Points
    2

    Par défaut Réorganisation d'un fichier xml, en tenant compte de variables

    Bonjour à toutes et tous,

    Je suis plutôt médiocre en programmation, mais généralement j'arrive à me débrouiller...

    Mais cette fois-ci, ça fait un moment que je cherche une solution à ma problématique, et je ne m'en sors pas.
    Mes recherches m'ont permis d'aboutir sur le fait que la solution se trouve certainement dans l'écriture d'un fichier xsl, mais je n'arrive pas à comprendre la chose suivante :

    Je dois réorganiser les sections d'un fichier xml, en tenant compte de l'ID de certaines sections. Voici un exemple :

    J'ai plusieurs points GPS suivis de plusieurs images JPG associées (pas systématiques), il peut y avoir plusieurs images par point :

    point655
    point656
    point657
    ...
    image657_1
    image655
    image657_2

    et je souhaite les réorganiser comme ceci :

    point655
    image655
    point656
    point657
    image657_1
    image657_2
    ...

    Voici le code réel généré par mon appareil (j'ai retiré les infos GPS):
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    <JOBFile>
    	<FieldBook>
    		<PointRecord ID="00000263" TimeStamp="2009-06-25T09:21:41">
    			<Name>655</Name>
    			<Code></Code>
    			<Description1 Name="Description">53</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<PointRecord ID="00000264" TimeStamp="2009-06-25T09:21:59">
    			<Name>656</Name>
    			<Code></Code>
    			<Description1 Name="Description">53</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<PointRecord ID="00000265" TimeStamp="2009-06-25T09:22:17">
    			<Name>657</Name>
    			<Code></Code>
    			<Description1 Name="Description">63</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<MediaFileRecord ID="000004b1" TimeStamp="2009-06-25T09:32:23">
    			<RecordID>00000265</RecordID>
    			<FileName>PIC_228.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_228.jpg  Point: 657</Note>
    			</Notes>
    		</MediaFileRecord>
     
    		<MediaFileRecord ID="000004b2" TimeStamp="2009-06-25T09:37:12">
    			<RecordID>00000263</RecordID>
    			<FileName>PIC_200.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_200.jpg  Point: 655</Note>
    			</Notes>
    		</MediaFileRecord>
     
    		<MediaFileRecord ID="000004b3" TimeStamp="2009-06-25T09:38:21">
    			<RecordID>00000265</RecordID>
    			<FileName>PIC_231.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_231.jpg  Point: 657</Note>
    			</Notes>
    		</MediaFileRecord>
    	</FieldBook>
    	<AutreSection1>
    	</AutreSection1>
    	<AutreSection2>
    	</AutreSection2>
    </JOBFile>
    Tous les "MediaFileRecord" sont regroupés sous les "PointRecord"


    Résultat souhaité :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    <JOBFile>
    	<FieldBook>		
    		<PointRecord ID="00000263" TimeStamp="2009-06-25T09:21:41">
    			<Name>655</Name>
    			<Code></Code>
    			<Description1 Name="Description">53</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<MediaFileRecord ID="000004b2" TimeStamp="2009-06-25T09:37:12">
    			<RecordID>00000263</RecordID>
    			<FileName>PIC_200.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_200.jpg  Point: 655</Note>
    			</Notes>
    		</MediaFileRecord>
     
    		<PointRecord ID="00000264" TimeStamp="2009-06-25T09:21:59">
    			<Name>656</Name>
    			<Code></Code>
    			<Description1 Name="Description">53</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<PointRecord ID="00000265" TimeStamp="2009-06-25T09:22:17">
    			<Name>657</Name>
    			<Code></Code>
    			<Description1 Name="Description">63</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<MediaFileRecord ID="000004b1" TimeStamp="2009-06-25T09:32:23">
    			<RecordID>00000265</RecordID>
    			<FileName>PIC_228.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_228.jpg  Point: 657</Note>
    			</Notes>
    		</MediaFileRecord>
     
    		<MediaFileRecord ID="000004b3" TimeStamp="2009-06-25T09:38:21">
    			<RecordID>00000265</RecordID>
    			<FileName>PIC_231.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_231.jpg  Point: 657</Note>
    			</Notes>
    		</MediaFileRecord>
     
    	</FieldBook>
    	<AutreSection1>
    	</AutreSection1>
    	<AutreSection2>
    	</AutreSection2>
    </JOBFile>
    Chaque "MediaFileRecord" est regroupé sous son "PointRecord" associé (grâce au RecordID)


    On voit que dans chaque "MediaFileRecord ID", il y a un "Record ID" correspondant au "PointRecord ID", c'est là que je bloque.
    Comment détecter la (ou les) image(s) correspondant à un point, et réecrire l'ensemble de la section "MediaFileRecord" à la suite de la section "PointRecord " ? Le reste du fichier doit quant à lui rester inchangé...

    Je pense que l'écriture d'un xsl adapté peut répondre à ce besoin, mais je n'ay arrive pas (peut être que ce n'est pas la bonne approche non plus ?)

    J'ai essayé d'être le plus clair possible, mais je ne suis pas sûr de bien me faire comprendre... Si vous souhaitez plus de détails, demandez moi !

    Merci d'avance pour l'aide que vous pourrez m'apporter

  2. #2
    Membre émérite
    Inscrit en
    octobre 2011
    Messages
    1 335
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 335
    Points : 2 346
    Points
    2 346

    Par défaut

    On peut le faire avec ces deux templates couplés.
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:template match="JOBFile">
        <xsl:copy>
            <xsl:apply-templates select="FieldBook" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="FieldBook">
        <xsl:copy>
            <xsl:for-each select="PointRecord">
                <xsl:copy-of select="." />
                <xsl:copy-of select="following-sibling::MediaFileRecord[normalize-space(RecordID)=current()/@ID]" />
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

  3. #3
    Candidat au Club
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    juillet 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique

    Informations forums :
    Inscription : juillet 2019
    Messages : 3
    Points : 2
    Points
    2

    Par défaut

    -> je suis bluffé !!!

    J'ai cherché si longtemps, et la réponse apparaît enfin !
    UN GRAND MERCI !

    Pourrais-je cependant demander quelques précisions quant à ce code (qui fonctionne très bien, certes !) de façon à mieux comprendre sa manière de fonctionner, car il faudrait que je l'adapte très légèrement pour que le résultat colle totalement à mes besoins... (en effet, dans un soucis de clarté quand j'ai posé la question, certaines parties de mon xml d'origine n'apparaissent pas... et n'apparaissent plus dans le fichier de sortie quand j'applique le xsl...)

    Pour faire simple, mon fichier se présente comme ceci :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    
     
    <JOBFile>
    	<FieldBook>
    
    		<AutreSection1>
    		</AutreSection1>
    
    
    		<AutreSection2>
    		</AutreSection2>
    
    		<AutreSectionN>
    		</AutreSectionN>
    
    		<PointRecord ID="00000263" TimeStamp="2009-06-25T09:21:41">
    			<Name>655</Name>
    			<Code></Code>
    			<Description1 Name="Description">53</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<AutreSectionX>
    		</AutreSectionX>
    
    		<PointRecord ID="00000264" TimeStamp="2009-06-25T09:21:59">
    			<Name>656</Name>
    			<Code></Code>
    			<Description1 Name="Description">53</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<PointRecord ID="00000265" TimeStamp="2009-06-25T09:22:17">
    			<Name>657</Name>
    			<Code></Code>
    			<Description1 Name="Description">63</Description1>
    			<Method>DirectReading</Method>
    			<SurveyMethod>Fix</SurveyMethod>
    			<Classification>Normal</Classification>
    			<Deleted>false</Deleted>
    			<StationID>000001c8</StationID>
    			<BackBearingID>000001c9</BackBearingID>
    			<TargetID>000001d1</TargetID>
    		</PointRecord>
     
    		<MediaFileRecord ID="000004b1" TimeStamp="2009-06-25T09:32:23">
    			<RecordID>00000265</RecordID>
    			<FileName>PIC_228.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_228.jpg  Point: 657</Note>
    			</Notes>
    		</MediaFileRecord>
     
    		<MediaFileRecord ID="000004b2" TimeStamp="2009-06-25T09:37:12">
    			<RecordID>00000263</RecordID>
    			<FileName>PIC_200.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_200.jpg  Point: 655</Note>
    			</Notes>
    		</MediaFileRecord>
     
    		<MediaFileRecord ID="000004b3" TimeStamp="2009-06-25T09:38:21">
    			<RecordID>00000265</RecordID>
    			<FileName>PIC_231.jpg</FileName>
    			<Notes>
    				<Note>Capturer fichier d&apos;Image: PIC_231.jpg  Point: 657</Note>
    			</Notes>
    		</MediaFileRecord>
    	</FieldBook>
    	<AutreSection1>
    	</AutreSection1>
    	<AutreSection2>
    	</AutreSection2>
    </JOBFile>
    Il y a quelques autres sections (en gras ci-dessus) que je dois conserver...
    Si vous pouviez m'expliquer un peu votre code, je devrais pouvoir le completer pour arriver à mes fins !

    En tout cas, encore un grand merci, je n'ais jamais été aussi près du résultat que j'attends !

    Edit :

    Je constate aussi ce petit problème : il y a des parfois des sections vides comme :
    qui ressortent comme ça après traîtement :
    Une petite idée ?

  4. #4
    Membre émérite
    Inscrit en
    octobre 2011
    Messages
    1 335
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 335
    Points : 2 346
    Points
    2 346

    Par défaut

    Il y a quelques autres sections (en gras ci-dessus) que je dois conserver...
    Eh bien, à la grande scène, c'est une transformation identique: donc, on la mets. Les templates pour JOBFile, FieldBook, PointRecord, MediaFieldRecord sont tous des spéciaux.
    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:template match="*|@*|text()">
        <xsl:copy>
            <xsl:apply-templates select="*|@*|text()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="JOBFile">
        <xsl:copy>
            <xsl:apply-templates select="*|@*|text()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="FieldBook">
        <xsl:copy>
            <xsl:apply-templates select="*[name()!='MediaFileRecord']|@*|text()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="PointRecord">
        <xsl:copy-of select="." /> 
        <xsl:copy-of select="following-sibling::MediaFileRecord[normalize-space(RecordID)=current()/@ID]" />
    </xsl:template>

    En ce qui concerne des balises dits "self-closing", c'est laissé gérer par le moteur xslt qu'on n'a pas de contrôle normalement; plus que souvent, c'est "self-closing" qui est choisi. Sémantiquement en tant que xml, c'est parfaitement équivalent <x/>, <x /> et <x></x>. En xslt propre, on ne peut pas faire choisir l'un plutôt que l'autre sans toucher/changer un peu de sémantique à proprement parler, comme inserer un commentaire vide, ou un espace vide... pour faire semblance d'avoir la forme dernière - ce n'est pas très souhaîtable de faire du tout. Avec une application propre avec le support de sax/dom pour faire re-construire le xml avec un peu plus de contrôle à cet endroit-là, ça peut le faire mais pas sans un peu de peine déjà pour rien. Il vaut mieux de les laisser "self-closing".

  5. #5
    Candidat au Club
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    juillet 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique

    Informations forums :
    Inscription : juillet 2019
    Messages : 3
    Points : 2
    Points
    2

    Par défaut

    Encore merci.... vous m'avez été d'une grande aide !

    Votre second message m'a d'une part permis de mieux comprendre le premier (l'ajout de code m'a fait comprendre des choses); et d'autre part m'a fait connaître les balises dites "self-closing" dont j'ignorais l’existence !

    Le traitement de mes (trèèèèssss) longs fichiers de points GPS va s'en trouver grandement optimisé. Tout le problème réside dans la sortie d'un appareil d'un côté, et ce qu'attend le logiciel en entrée de l'autre... Les constructeurs/développeurs devraient s'entretenir sur certains points parfois

    Je passe donc le sujet en résolu !

    Encore un grand merci !

    .Guillaume.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/04/2015, 09h59
  2. découpage de fichier texte en tenant compte d'un délimiteur
    Par c_salsabil dans le forum Général Java
    Réponses: 3
    Dernier message: 29/12/2009, 20h56
  3. Réponses: 2
    Dernier message: 29/02/2008, 18h08
  4. [SimpleXML] Compte utilisateur en fichier xml
    Par Pierrick584 dans le forum SimpleXML
    Réponses: 8
    Dernier message: 07/08/2007, 21h54
  5. [XML] validation de fichier XML:l'ordre des balises compte ?
    Par longbeach dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 04/09/2005, 18h53

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