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 :

Epurer un XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut Epurer un XML
    Bonjour,

    J'ai un XMl que j'aimerais bien épurer de toute ces balises xml avec un préfix w: et garder seulement le celle en qui sont préfixer ns0:.

    Le problème est qu'il s'agit d'un contenu mixte et qu'il faut conserver les espaces.

    Xml:
    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <ns0:publicationText Numero="324" lang="fr" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:ns0="http://toto.com/xmlnamespace">
    	<w:p/>
    	<w:p>
    		<ns0:nameActual>
    			<w:r>
    				<w:rPr>
    					<w:b/>
    				</w:rPr>
    				<w:t xml:space="preserve">Henry</w:t>
    			</w:r>
    		</ns0:nameActual>
    		<w:r>
    			<w:t>, </w:t>
    		</w:r>
    		<w:r>
    			<w:t xml:space="preserve">est le nom de mon </w:t>
    		</w:r>
    		<ns0:Animal>
    			<w:r>
    				<w:rPr>
    					<w:i/>
    				</w:rPr>
    				<w:t xml:space="preserve">Chat</w:t>
    			</w:r>
    		</ns0:Animal>
    		<w:r>
    			<w:t xml:space="preserve">, </w:t>
    		</w:r>
    		<ns0:number13>
    			<w:r>
    				<w:t xml:space="preserve">324</w:t>
    			</w:r>
    		</ns0:number13>
    		<w:r>
    			<w:t xml:space="preserve"> est le numéro de son médaillon,</w:t>
    		</w:r>
    		<w:r>
    			<w:t> </w:t>
    		</w:r>
    		<w:r>
    			<w:t xml:space="preserve">il aime manger des croquet et est de couleur</w:t>
    		</w:r>
    		<w:r/>
    		<ns0:Color>
    			<w:r>
    				<w:rPr>
    					<w:i/>
    				</w:rPr>
    				<w:t xml:space="preserve">Marron</w:t>
    			</w:r>
    		</ns0:Color>
    		<w:r>
    			<w:t xml:space="preserve">. </w:t>
    		</w:r>
    	</w:p>
    </ns0:publicationText>

    Comment faire pour récupérer mon text via une transfo XSLT et qu'il ressorte comme ca:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <ns0:publicationText Numero="324" lang="fr" xmlns:ns0="http://toto.com/xmlnamespace"><ns0:nameActual>Henry</ns0:nameActual>, est le nom de mon <ns0:Animal>Chat</ns0:Animal>, <ns0:number13>324</ns0:number13> est le numéro de son médaillon, il aime manger des croquet et est de couleur <ns0:Color>Marron</ns0:Color>.</ns0:publicationText>

    Je veux pas une réponse toute faite, juste une indication ou un lien pour m'aider a comprendre comment je pourrais le faire.


    Merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Pour commencer, il faut déclarer le namespace xmlns:w dans la racine de la stylesheet, afin de pouvoir s'en servir.

    Ensuite, il faut définir deux templates :

    - un qui match absolument tout : éléments, textes, éventuelles PI. match="node()".
    Ce template copie le nœud matché, et à l'intérieur il copie les éventuels attributs d'élément, puis il invoque apply-templates pour traiter les éventuels descendants d'élément.

    - un qui ne matche que les éléments de préfixe w : match="w:*".
    Celui-ci ne copie pas le nœud matché ni ses attributs. Il ne fait que apply-templates, pour traiter son contenu, mais pas se traiter lui-même.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Bonjour,

    merci pour la réponse.

    Pour ce qui est des deux template c'est plus ou ce que j'essayais de faire mais ce que je comprends pas c'est comment copier le text contenu entre les balises...

    moi j'étais arrivé à ca (ce qui se raproche de ce que vous me conseillez):

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"  xmlns:ns0="http://ws.powernet.ch/webservices">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:template match="/">
    		<xsl:apply-templates select="//ns0:publicationText"/>
    	</xsl:template>
    	<xsl:template match="ns0:*">
    		<xsl:element name="{name()}">
    			<xsl:apply-templates select="*"/>
    		</xsl:element>
    	</xsl:template>
    	<xsl:template match="w:*">
    		<xsl:apply-templates select="*"/>
    	</xsl:template>
    </xsl:stylsheet>

    Avec ca je récupére l'aborescence des ns0: mais sans le contenu.

    Donc je suis déjà ravi de constaté que je suis pas complétement faux mais je ne vois pas vraiment comment copier partie du text et continuer la navigation dans l'arbre.

    Il faut bien comprendre que le noeud publicationtext est un contenu mixte et que les autre ns0: ne contienne rien d'autre que leur valeur.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Il faut bien comprendre que le noeud publicationtext est un contenu mixte...
    Ce n'est pas tout-à-fait vrai si vous ne le qualifiez par le publicationText resultant.

    Je veux pas une réponse toute faite, juste une indication ou un lien pour m'aider a comprendre comment je pourrais le faire.
    Je n'ai pas forcément compris ce qu'il s'implique psychologiquement: si toutes les pages du monde consacrent à xslt n'ont pas réussi à vous faire comprendre ce que chaque élément de xslt intend de faire, comment voulez-vous on peut réussir ici limité par le temps et l'espace à vous faire comprendre beaucoup mieux? Oui, oui, je sais presque ce que vous voulez dire...
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"  
        xmlns:ns0="http://toto.com/xmlnamespace">
    <xsl:strip-space elements="*" /> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="no"/>
    <xsl:template match="/">
       <xsl:apply-templates select="*"/>
    </xsl:template>
    <xsl:template match="ns0:*">
        <xsl:element name="{name()}">
            <xsl:for-each select="@*">
                <xsl:attribute name="{name()}">
                    <xsl:value-of select="." />
                </xsl:attribute>
            </xsl:for-each>
            <xsl:apply-templates select="*"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="w:*">
        <xsl:apply-templates select="*|text()" />
    </xsl:template>
    </xsl:stylesheet>
    Est-ce-que ça a réussit à expliquer dépend combien d'effort pour faire à comprendre le code à votre côté. Je dois presque présenter mon excuse.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Il y a bien plus simple -_-°...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!-- Copier tout et son contenu -->
    <xsl:template match="node()">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
     
    <!-- Sauf les w: -->
    <xsl:template match="w:*">
      <xsl:apply-templates/>
    </xsl:template>

  6. #6
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je n'ai que à dire ceci: il y a une issue bien plus délicate que j'ai essayé de mettre en valeur sans fanfare et c'est de defendre le préfixe w de persister d'apparaitre dans le document résultant. Là, c'est déjà le code minimaliste sauf, si il y en a, des simplifications de réecriture triviale.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Merci pour vos réponse

    Quand je dis que je veux pas de réponse toute faite c'est pour expliquer que je suis prêt a chercher et que je m'attends pas a un xslt tous fait.

    Genre si thelvin m'aurais juste répondu regarde du coté de xsl:copy je pense que j'aurais trouvé

    Maintenant faut encore que je me débarasse des préfix ns0: dans le nom de la balise, je vais chercher comment faire et si je peux pas ben je ferrais la transfo en deux fois.

    En tous cas vous êtes des chefs

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par totoen Voir le message
    Genre si thelvin m'aurais juste répondu regarde du coté de xsl:copy je pense que j'aurais trouvé
    Mais il aurait fallu pour cela que je sache précisément à quel niveau tu en étais, et je n'avais vraiment aucune chance de le deviner à ton premier post. Le second, par contre...

    Ensuite, je t'ai donné une solution fonctionnelle toute prête, parce que tu en avais déjà reçu une autre de toute façon. Seulement, je la trouvais inutilement compliquée, et je préférais fournir un autre code tout fait, mais aussi simple que XSLT le permet.

    Citation Envoyé par totoen Voir le message
    Maintenant faut encore que je me débarasse des préfix ns0: dans le nom de la balise, je vais chercher comment faire et si je peux pas ben je ferrais la transfo en deux fois.
    Commence par te demander si tu veux
    - enlever le namespace (pas de xmlns, pas de namespace dans le document)
    - enlever le préfixe des balises, mais leur laisser leur namespace, qui sera un namespace par défaut au lieu d'un namespace préfixé. (xmlns="http://toto.com/xmlnamespace" dans la racine)

  9. #9
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Ma version de solution est déjà bien placée pour faire ça. Elle a déjà débarrasé l'espace de w par la moyen de réecriture de document xml. Il suffit de faire encore un petit pas de plus.

    Remplacez ceci:
    <xsl:element name="{name()}">
    par cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        <xsl:element name="{local-name()}">
    Et ce serait fait.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    @thelvin: oui effectivement je l'ai pas précisé... et pas besoin de vous justifier je répondais juste à votre question

    Je suis d'ailleurs très content d'avoir une réponse tout faite et comme ca je peux allez sur w3schools et lire le description de xsl:copy.

    Oui je me débrouille en XSLT je suis pas une star mais j'y arrive quand c'est pas des fonctions spéciale que je connais pas.

    Pour ce qui est de votre question ca m'est égale que se soit l'un ou l'autre c'est égale car pour le traitement suivant je peux spécifier si namespace ou pas de namespace.


    @tsuji: désolé j'ai oublié de vous le dire mais votre solution ne renvoit pas le contenu des balises et elle est très analogue à la proposition dans mon second post.

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par totoen Voir le message
    Pour ce qui est de votre question ca m'est égale que se soit l'un ou l'autre c'est égale car pour le traitement suivant je peux spécifier si namespace ou pas de namespace.
    Hum. Dans les cas "on s'en fout", il vaut mieux pas de namespace du tout.

    Citation Envoyé par totoen Voir le message
    @tsuji: désolé j'ai oublié de vous le dire mais votre solution ne renvoit pas le contenu des balises et elle est très analogue à la proposition dans mon second post.
    Ça marche en fusionnant sa solution et la mienne.

    <xsl:copy> sert à copier le nom avec ses namespaces. Or, nous, nous ne voulons plus copier les namespaces, mais seulement le nom local.
    Pour copier le nom local, le plus simple est <xsl:element name="{local-name()}">

  12. #12
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Vous avez à xml document et à xsl document montré deux differents noms
    xmlns:ns0="http://toto.com/xmlnamespace"
    xmlns:ns0="http://ws.powernet.ch/webservices"
    J'ai fait un choix consistent: c'est à vous de faire un choix qui est le vrai nom vous utilisez.

    Elle ne mache pas? Je ne pense pas... et je ne sais quoi dire que il vous faut étudier un peu plus le sujet.

Discussions similaires

  1. Epurer un fichier XML
    Par pinjul dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 05/02/2013, 16h36
  2. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29
  3. delphi XML / HTML caractéres speciaux !
    Par adem dans le forum EDI
    Réponses: 2
    Dernier message: 29/08/2002, 17h48
  4. Débutant XML
    Par viny dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 25/07/2002, 12h07
  5. Pas de casse dans les XML
    Par :GREG: dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 13h51

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