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 :

Template tenant compte des précédents ? Ou comment supprimer un noeud. [XSLT 2.0]


Sujet :

XSL/XSLT/XPATH XML

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 44
    Points : 72
    Points
    72
    Par défaut Template tenant compte des précédents ? Ou comment supprimer un noeud.
    Bonjour,

    Voilà mon problème, j'ai mon fichier en entrée qui possède des noeuds <location> et <anticipatedStance>. Je sais les supprimer. Cependant, j'ai besoin de faire des opérations dessus, j'ai donc un autre template qui opère sur un Path similaire, et l'écrase. Ainsi, on ne tient plus compte des templates précédents, et je me retrouve en sorti avec tjr <location> et anticipatedStance> existant.

    J'ai bien réussi à en faire disparaitre un avec un <xsl:apply-templates select="* except anticipatedStance"/>, mais je ne parviens pas à faire de même pour location (en même temps). J'ai aussi essayé d'enchainer 2 apply-templates, mais Saxon n'apprécie pas.

    Mon code 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
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ns14:NC1_OPORD xmlns:ns14="urn:fra:nc1:message:opord"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:ns3="http://www.w3.org/2001/XMLSchema"
                    xmlns:ns47="urn:fra:nc1:objet:unit"
                    classification="0"
                    situation="OPO 01"
                    id="0"
                    lastChangeDatetime="2019-06-27T12:56:55.309Z"
                    majorVersion="8"
                    mediumVersion="1"
                    minorVersion="1"
                    urgencyLevel="0">
       <_3_execution>
          <A_intention>
             <maneuverStep1>
                <mixedText>ATTAQUE + RAID Du 250600 Z JUN au 251500Z JUN Appuyé massivement par l'artillerie, après avoir débouché sur ordre de LD, attaquer sur l'ensemble du fuseau, au minimum fixer au mieux débuter la destruction des BM ECH1. Lancer simultanément un raid blindé pour fixer au plus vite le 314 (RU) BC. </mixedText>
                <objects>
                   <object xsi:type="ns47:UnitType"
                           activationChangeDatetime="2019-06-27T06:50:35Z"
                           activationStatus="1"
                           id="0:6041:6"
                           isFull="1"
                           lastChangeDatetime="2019-06-27T06:50:35Z"
                           majorVersion="8"
                           mediumVersion="1"
                           minorVersion="1">
                      <tacticalData>
                         <name>311 (RU) BNMECA</name>
                         <symbolCode>APP6B:SHGPUCIZ---FXR-</symbolCode>
                      </tacticalData>
    				  <location>
                         <point>
                            <x>4.763808173392329</x>
                            <y>49.359748456781055</y>
                         </point>
                         <datetime>2019-06-20T08:02:16Z</datetime>
                         <validityPeriod>
                            <startDatetime>2019-06-20T08:02:16Z</startDatetime>
                            <duration>P2Y</duration>
                         </validityPeriod>
                      </location>
                      <anticipatedStance>
                         <validityPeriod>
                            <startDatetime>2007-06-20T08:02:16Z</startDatetime>
                            <endDatetime>2007-06-27T10:03:15Z</endDatetime>
                         </validityPeriod>
                         <locationStance>
                            <point>
                               <x>4.81506729114335</x>
                               <y>49.380025920244194</y>
                            </point>
                         </locationStance>
                      </anticipatedStance>
                      <anticipatedStance>
                         <validityPeriod>
                            <tacticalTime>1</tacticalTime>
                         </validityPeriod>
                         <locationStance>
                            <point>
                               <x>4.81606729114335</x>
                               <y>49.381025920244194</y>
                            </point>
                         </locationStance>
                      </anticipatedStance>
                      <anticipatedStance>
                         <validityPeriod>
                            <tacticalTime>2</tacticalTime>
                         </validityPeriod>
                         <locationStance>
                            <point>
                               <x>4.85506729114335</x>
                               <y>49.380025920244194</y>
                            </point>
                         </locationStance>
                      </anticipatedStance>
                   </object>
                </objects>
             </maneuverStep1>
          </A_intention>
       </_3_execution>
    </ns14:NC1_OPORD>
    Mon code 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
     
    <?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"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:fn="http://www.w3.org/2005/xpath-functions"
        xmlns:nc1opord="urn:fra:nc1:message:opord"
        exclude-result-prefixes="xs fn"
        version="2.0">
        <xsl:output
            method="xml"
            encoding="UTF-8"
            indent="yes"
            omit-xml-declaration="no"
        />
        <xsl:strip-space elements="*" />
     
        <!-- On cherche les documents XML entiers -->
        <xsl:template match="/">
            <!-- On cherche tous les documents XML dans le même répértoire -->
            <xsl:for-each select="collection('./?select=*.xml')" >
                <!-- On recopie les fichiers XML de sorties dans le dossier 'resultat' avec les mêmes noms que les fichiers de départ -->
                <xsl:result-document method="xml" href="resultat/{tokenize(document-uri(.), '/')[last()]}">
                    <xsl:copy>
                        <xsl:apply-templates select="@*|node()"/>
                    </xsl:copy>
                </xsl:result-document>
            </xsl:for-each>
        </xsl:template>
     
        <xsl:template match="nc1opord:NC1_OPORD//@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
     
        <xsl:template match="nc1opord:NC1_OPORD//anticipatedStance"/>
        <xsl:template match="nc1opord:NC1_OPORD//_3_execution/A_intention//object[@xsi:type[contains(., 'UnitType')]]/location"/>
     
        <xsl:template match="nc1opord:NC1_OPORD//_3_execution/A_intention">
            <xsl:copy>
                <xsl:variable name="locationManeuver">
                    <xsl:apply-templates select="*"/>            
                </xsl:variable>
                <xsl:copy-of select="$locationManeuver"></xsl:copy-of>
            </xsl:copy>
        </xsl:template> 
     
    </xsl:stylesheet>
    Je vous remercie d'avance !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 826
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 826
    Points : 20 062
    Points
    20 062
    Par défaut
    Hello,

    aucun template n'est écrasé, dans ton exemple. Il ne sert donc à rien. Il faut un vrai exemple.

    Mais bon,

    Citation Envoyé par Tahrky Voir le message
    J'ai bien réussi à en faire disparaitre un avec un <xsl:apply-templates select="* except anticipatedStance"/>, mais je ne parviens pas à faire de même pour location (en même temps). J'ai aussi essayé d'enchainer 2 apply-templates, mais Saxon n'apprécie pas.
    Dans ce cas,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="* except (anticipatedStance | location)"/>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 44
    Points : 72
    Points
    72
    Par défaut
    Désolé pour le mauvais vocabulaire, ce que j'entends par "écrasé", c'est que la recopie de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="nc1opord:NC1_OPORD//_3_execution/A_intention">
    ne tiens pas compte des 2 instructions précédentes (ce qui est normal, vu que le fichier en entrée n'est pas modifié) mais comment continuer d'opérer sur le même flux, si c'est possible ?

    Je sais qu'il n'y a pas de "séquences" ni "d'états" en XSLT, puisque c'est un langage fonctionnel. Mais peut-on récupérer les données d'un flux afin de s'en servir en entrée d'une autre fonction ?

    En gros, comment s'assurer qu'une opération X soit bien faite de partout, sans avoir à la recopier (et parfois l'adapter de manière plus ou moins complexe) à divers endroits du fichier XSL, afin d'éviter les erreurs et les oublis ?

    Sinon, le bout de code que tu m'as donné me donne exactement le résultat attendu (modulo que j'aimerais bien ne pas forcément tjr avoir à recopier des choses du genre afin d'essayer de réduire au maximum les erreurs). Mon soucis est que je n'avais pas essayé les parentheses, et que sans ça, il ne prenait que le premier paramètre ...

    Merci beaucoup pour ta réponse rapide.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 826
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 826
    Points : 20 062
    Points
    20 062
    Par défaut
    Non vraiment, il faut des exemples.

    Cela dit, si tu es arrivé à t'en sortir convenablement, c'est aussi bien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 44
    Points : 72
    Points
    72
    Par défaut
    Apparemment, le problème que je rencontrais avant n'est plus.
    Donc, je ne sais même pas si ma question a réellement un sens ou si c'est juste que je m'y prenais mal. J'arrive à obtenir le bon résultat avec le XSLT que je cite dans mon 1er post (et qui bien sur avant ne me donnait pas le résultat attendu ...).

    Je pense ne pas saisir toute la subtilité de la différence de comportement entre '*' et '.', puisque * semble tenir compte ici des précédentes modifications. (Et que de toute façon . n'est pas autorisé, créant un comportement circulaire que saxon refuse).

    En tout cas merci pour ton aide ! Je peux de nouveau avancer, et j'ai une autre façon de faire si jamais j'ai des problèmes de la sorte qui surviendrait !

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

Discussions similaires

  1. [XSLT 2.0] Supprimer les doublons en tenant compte des descendants
    Par Myrkiriad dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/04/2014, 11h10
  2. Comment tenant compte des données déjà generés?
    Par guillon_ dans le forum MATLAB
    Réponses: 2
    Dernier message: 15/12/2013, 15h32
  3. Réponses: 1
    Dernier message: 18/09/2011, 18h26
  4. Réponses: 9
    Dernier message: 17/02/2011, 18h14
  5. Réponses: 13
    Dernier message: 03/12/2005, 18h09

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