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 :

Corriger un document : tester et remplacer certaines valeurs


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 245
    Points : 106
    Points
    106
    Par défaut Corriger un document : tester et remplacer certaines valeurs
    Bonjour,

    J'ai besoin, en XSLT, de corriger un document XML existant. Par exemple, tester la valeur du champ <date>, et si elle est nulle, mettre une valeur par défaut.
    Si je vois très bien comment créer un nouveau document grâce à XSLT, le fait de devoir simplement effectuer des modifications me déroute !

    Merci pour vos conseils.

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 245
    Points : 106
    Points
    106
    Par défaut
    J'ai réussi à avancer, mais c'est sûrement loin d'être optimisé :

    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
    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>
     
    <xsl:template match="/root/date">
      <date>
        <xsl:choose>
          <xsl:when test=". != ''">
            <xsl:value-of select="."/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="date:date()"/>
          </xsl:otherwise>
        </xsl:choose>
      </date>
    </xsl:template>

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Hello,
    Tu peux plus simplement intégrer ton test dès la déclaration du template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="/root/date[text()='']">
      <date>
            <xsl:value-of select="date:date()"/>
      </date>
    </xsl:template>

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 245
    Points : 106
    Points
    106
    Par défaut
    Merci, j'étais passé à côté de cette syntaxe XPath.

    Le problème avec cette technique, c'est que mes namespaces sont répétés sur chaque élément modifié.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    C'est à dire, t'as quoi en sortie?
    Quand, on écrit juste <date> dans le xsl, il y a pas de namespace spécifié, il a donc celui par défaut. Si date doit en avoir un, il faut le spécifier dans le xsl.

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 245
    Points : 106
    Points
    106
    Par défaut
    Le document que je corrige n'a aucun namespace à l'origine. Après l'avoir traité avec la moulinette, chaque élément modifié récupère les namespaces appliqués à <stylesheet> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <date xmlns:str="http://exslt.org/strings" xmlns:date="http://exslt.org/dates-and-times">2009-07-30</date>

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Etrange.
    Dans ton élement racine style-sheet tu peux essayer d'ajouter l'attribut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exclude-result-prefixes="str date"

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    245
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 245
    Points : 106
    Points
    106
    Par défaut
    Merci !

  9. #9
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 51
    Points
    51
    Par défaut Ajout de la valeur d´un nouvel attribut
    Citation Envoyé par Morbo Voir le message
    Hello,
    Tu peux plus simplement intégrer ton test dès la déclaration du template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="/root/date[text()='']">
      <date>
            <xsl:value-of select="date:date()"/>
      </date>
    </xsl:template>
    Bonjour à vous,

    et si au lieu d´écrire la nouvelle date entre la balise <date>...</date>, on voudrait plutôt l´ajouter comme nouvel attribut d´une balise quelconque (et qui n´existe pas déjà dans le fichier XML d´origine)? Par exemple, on aimerait ajouter ce nouveau noeud dans un fichier XML:
    <Anniversaire date="(?)">C´est mon anniv</Anniversaire>

    Comment faire? J´ai tout bonnement essayé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Anniversaire date="date:date()">C´est mon anniv</Anniversaire>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Anniversaire date="$maDate">C´est mon anniv</Anniversaire>
    Mais cà ne marche pas. J´obtiens exactement mon code à la sortie, sans remplacement de la valeur de mon attribut.

    Merci pour toute aide.

    Sylvie

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Hello,
    Il faut utiliser des crochets pour indiquer d'évaluer le XPATH:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Anniversaire date="{date:date()}">C´est mon anniv</Anniversaire>
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Anniversaire date="{$maDate}">C´est mon anniv</Anniversaire>
    ou encore, plus verbeusement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Anniversaire>
    <xsl:attribute name="date" select="date:date()"/>C´est mon anniv</Anniversaire>
    (à moins qu'on puisse pas intégrer le select dans xsl:attribute, je sais plus)

  11. #11
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 51
    Points
    51
    Par défaut
    Salut Morbo,

    Merci pour ta réponse.
    Les deux premières solutions fonctionnent très bien. Je ne savais pas qu´il fallait utiliser les accolades pour signifier au processeur xslt que du xpath arrive.
    Comme tu le craignais déjà le "select" est invalide ou pas permis dans le <xsl:attribute/>, mais cà marche très bien ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Anniversaire><xsl:attribute name="date"><xsl:value-of select="date:date()"/></xsl:attribute>C´est mon Anniv</Anniversaire>
    Merci encore.
    Sylvie

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 28/02/2013, 16h59
  2. [XL-2000] Tester une cellule et remplacer la valeur
    Par Tydher dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/07/2011, 11h12
  3. Cacher certaines valeurs avec TDBEdit
    Par Vulcanos dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/09/2005, 16h14
  4. [XML] Comment remplacer la valeur de la balise ?
    Par laclac dans le forum Langage
    Réponses: 4
    Dernier message: 19/08/2005, 15h10
  5. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15

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