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 :

XSL et NameSpace variable


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut XSL et NameSpace variable
    Bonjour,

    Prenons un XML de ce type :

    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" ?>
    <pipo>
      <totos>
        <blabla>aaa</blabla>
        <blabla>bbb</blabla>
        <blabla>ccc</blabla>
      </totos>
      <gigis>
        <mumu>hhh</mumu>
        <mumu>kkk</mumu>
        <mumu>vvv</mumu>
      </gigis>
      <dudus xmlns="loulou">
        <riri>111</riri>
        <riri>222</riri>
        <riri>333</riri>
      </dudus>
    </pipo>
    Je désire construire 2 fichiers XSL :

    • le premier donnerait en sortie tout le fichier sans le sous arbre <dudus>,
    • le deuxième donnerait en sortie uniquement le sous arbre <dudus>.


    Comment faire sachant que le NameSapce est variable d'un XML a un autre ?

    J'ai bien trouvé ça pour le 2ème XSL, mais en spécifiant le Name Space hélas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:zz="loulou">
      <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
      <xsl:template match="/">
        <xsl:apply-templates select="//zz:dudus"/>
      </xsl:template>
    </xsl:stylesheet>
    Merci.

  2. #2
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    J'ai ajouté « DEFI » car je n'ai absolument rien trouvé sur le net

    Est-ce que quelqu'un a une idée ?

  3. #3
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    regarde du côté de la fonction XPath local-name().
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Oui en effet, ça marche en utilisant cette commande XPath

    Même en complexifiant juste un peu le XML de départ 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
     
    <?xml version="1.0" encoding="utf-8" ?>
    <pipo>
      <totos>
        <blabla>aaa</blabla>
        <blabla>bbb</blabla>
        <blabla>ccc</blabla>
      </totos>
      <gigis>
        <mumu>hhh</mumu>
        <mumu>kkk</mumu>
        <mumu>vvv</mumu>
      </gigis>
      <dudus xmlns="loulou">
        <dudu>
          <riri>111</riri>
          <riri>222</riri>
          <riri>333</riri>
        </dudu>
      </dudus>
    </pipo>
    En utilisant le XSL suivant (merci à GrandFather):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:zz="loulou">
      <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
      <xsl:template match="/">
        <xsl:apply-templates select="//*[local-name() = 'dudus']/*"/>
      </xsl:template>
    </xsl:stylesheet>
    On obtient bien 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"?>
    <dudu xmlns="loulou">
      <riri>111</riri>
      <riri>222</riri>
      <riri>333</riri>
    </dudu>
    Question : Pourquoi <dudu> hérite-t-il du NameSpace « loulou » ?

    Merci.

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par domiq44 Voir le message
    Question : Pourquoi <dudu> hérite-t-il du NameSpace « loulou » ?
    Parce que dans le document source il appartient à cet espace de noms (un espace de nom par défaut s'applique pour l'élément où il est déclaré et à tous ses descendants), et xsl:copy ne change pas l'espace de nom de l'élément copié.

    Si tu souhaites que dudu n'ait pas d'espace de noms, utilise plutôt 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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:zz="loulou">
      <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
      <xsl:template match="@*|processing-instruction()|comment()">
        <xsl:copy-of select="."/>
      </xsl:template>
      <xsl:template match="*">
        <xsl:element name="{local-name()}">
          <xsl:apply-templates />
        </xsl:element>
      </xsl:template>
      <xsl:template match="/">
        <xsl:apply-templates select="//*[local-name() = 'dudus']/*"/>
      </xsl:template>
    </xsl:stylesheet>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Ce script est qu'il supprime bien le NameSpace de <dudu>, mais aussi à tord celui de ses descendant

    Moi ce que je souhaite réussir à faire, est une copie conforme de <dudu> et de ses descendants.

    C'est à dire que si <dudu> possède un NameSpace, le prendre, et la même chose pour ses descendants.

    Si un enfant, n'en possède pas, le laisser comme ça et ne pas en ajouter.

    Est-ce possible ?

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

Discussions similaires

  1. [XSL] Passage de variable dans un template
    Par Otarie dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/11/2005, 23h50
  2. Compteur XSL...Portée des variables limitée
    Par lanfeustdetroy dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 03/06/2005, 14h12
  3. [XSL]Creer un variable pour mettre un width="" pou
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 28/04/2005, 16h37
  4. [XSL] utiliser une variable pour nom d'élément
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 07/09/2004, 13h58
  5. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19

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