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 :

Problème d'extraction et xmlns:xsi [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    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
    Par défaut Problème d'extraction et xmlns:xsi
    Bonjour

    J'ai un petit soucis avec une extraction qui commence à me rendre chèvre (en gros je trouve pas la solution...)

    j'ai le fichier XML source suivant

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <mes_entrees_A>
    ...
    </mes_entrees_A>
     
    <mes_entrees_B>
    	<nom>bob</nom>
    	<prenom>leponge</prenom>
    	<adresse>
    		<ligne1>chemin bis</ligne1>
    		<ligne2>12000</ligne2>
    		<ligne3>Le villars</ligne3>
    	</adresse>
    	<fonction>Eponge</fonction>
    </mes_entrees_B>
     
    </base>
    sur lequel j'applique une extraction toute simple avec :

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

    et j'ai dans mes résultats pour tous les premiers noeuds, le xmlns xsi qui apparait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <base>
    <nom xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">bob</nom>
    <prenom xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">leponge</prenom>
    <adresse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ligne1>chemin bis</ligne1>
    <ligne2>12000</ligne2>
    <ligne3>Le villars</ligne3>
    </adresse>
    <fonction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Eponge</fonction>
    </base>

    ...comment faire pour ne pas l'avoir ??

    Merci d'avance

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    [0] Quand vous trouvez vous avez besoin de ceci
    <xsl:template match="text()"/>
    cela souvent s'implique que vous n'avez pas investi suffisamment de contrôle sur la progression de matcher des templates.

    Dans ce cas ci, il suffit de mettre un template qui semble assez innocent. Est-ce que c'est une amélioration ou pas, à chacun son goût: pour moi, si.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="/">
        <xsl:apply-templates select="base/mes_entrees_B" />
    </xsl:template>
    [1] Alors, pour éviter l'apparition des declarations inutiles des espaces de nom dans le résultat, un principe général est qu'il faut presque toujours exiger de réécriture le xml sortant. C'est le principe directeur: pour ce cas ci, ça se réalise comme une petite métamorphose de la transformation identique. Au titre d'exemple complet, c'est comme ça.
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>		  
    <xsl:template match="/">
        <xsl:apply-templates select="base/mes_entrees_B" />
    </xsl:template>
     
    <xsl:template match="mes_entrees_B">
        <root>
            <xsl:apply-templates select="@*|text()|*" mode="rewrite" />
        </root>
    </xsl:template>
     
    <xsl:template match="*" mode="rewrite">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|text()|*" mode="rewrite" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*" mode="rewrite">
        <xsl:attribute name="{local-name()}">
            <!--
            <xsl:apply-templates select="@*|text()|*" mode="rewrite" />
            -->
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>
     
    <!-- pas 100% nécessaire, juste pour clarité et parallelisme -->
    <xsl:template match="text()" mode="rewrite">
        <xsl:value-of select="." />
    </xsl:template>
     
    <!-- 
    <xsl:template match="text()"/>
    -->
    </xsl:stylesheet>
    ps (ajouté): je n'ai pas simplifié ou spécialisé les xsl:apply-templates dans les templates des 'rewrite' pour garder de plus près la tranformation identique ordinaire. Mais je décide de mettre alternative de cette considération à coté en parallel.

  3. #3
    Membre expérimenté
    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
    Par défaut
    Merci Tsuji pour cette réponse !

    Je n'imaginais pas que la résolution de ce simple problème nécessitait une manière aussi avancée de codage.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par caballo Voir le message
    Je n'imaginais pas que la résolution de ce simple problème nécessitait une manière aussi avancée de codage.
    Le problème c'est que les namespaces font partie intégrantes des éléments qui les voient. Donc copier ces balises copiera toujours les namespaces. Et en XSLT il est impossible de supprimer, la seule chose possible est "ne pas ajouter."
    Donc oui, la seule solution est de réécrire tous les éléments sans ajouter leurs namespaces. Ce qui est compliqué.

    Mais il y a avait plus simple :
    - mode="rewrite" est un principe de codage propre, pour les feuilles XSLT complexes. Pour un truc aussi simple ce n'était pas utile.
    - comme il le dit, le template match="text()" n'est pas spécialement utile, il est juste là pour faire propre.
    - le template sur @* pouvait être un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="@*">
      <xsl:copy/>
    </xsl:template>
    Les attributs ne sont pas des éléments, ceux-là ils n'ont pas de namespace et on peut les copier sans problème.
    - Et en fait il n'était pas nécessaire de faire un apply-template et un template sur @*. Un simple <xsl:copy-of select="@*"/> faisait l'affaire.

    Conclusion, on pouvait simplifier un petit peu :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>		  
    <xsl:template match="/">
        <root>
           <xsl:apply-templates select="//mes_entrees_B/node()" />
        </root>
    </xsl:template>
     
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
     
    </xsl:stylesheet>
    C'est nettement moins flexible par contre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expérimenté
    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
    Par défaut
    Merci pour ces précisions Thelvin

    J'étais justement en train de me poser la question sur les attributs et la nécessité de supprimer leur namespace et venait à nouveau sur le fil pour poser la question... Et ô miracle la réponse était là
    C'est nickel.
    La ruse c'est que je cherchais absolument à "supprimer" et donc mauvaise piste...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/09/2007, 17h01
  2. [MySQL] Problème d'extraction de données d'un tableau
    Par cyberdevelopment dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/04/2007, 13h11
  3. [XML][tinyXML] Problême d'extraction de données XML ac tinyxml
    Par Jahprend dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 19/03/2007, 09h35
  4. problème d'extraction de données html
    Par spootnic22 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/11/2006, 13h24
  5. Problème d'extraction d'un fichier zip
    Par njely dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2005, 22h36

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