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

XML/XSL et SOAP Discussion :

Comment transformer une balise xml dans une requete xsl:for-each [Débutant(e)]


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 14
    Par défaut Comment transformer une balise xml dans une requete xsl:for-each
    Bonjour à tous, me revoila avec une nouvelle question.
    Mon besoin est de transformer un flux xml avec xsl puis de générer un fichier csv. J'arrive jusqu'au fichier csv mais il est mal formé à cause de caractère spéciaux émanent de balise xml à l'interieur de ma boucle for-each.

    un bout du xml ou se trouve le problème :
    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
     
    <article idArticle="lea10018816" rubrique="social" dateArticle="27/04/2012">
    <titrearticle>La lisibilité du bulletin de paie bientôt améliorée*?</titrearticle>
    <chapitre>
    <titrechapitre>Une loi récente prévoit de simplifier les bulletins de paie à compter de l'année prochaine.</titrechapitre>
    <contenu>
    <paragraphe>
    					<texteparagraphe>La récente loi de simplification du droit contient un article visant à améliorer la lisibilité du bulletin de paie et à réduire le nombre de lignes qu’il contient, notamment celles relatives aux cotisations et contributions sociales. Deux étapes sont prévues à cet effet.</texteparagraphe>
    					<texteparagraphe>La première, consiste à l’harmonisation, au plus tard le 1<exposant>er</exposant>*janvier 2013, des dispositions réglementaires définissant les éléments nécessaires au calcul de différentes cotisations sociales (assurances sociales, assurance chômage, retraite complémentaire).</texteparagraphe>
    					<texteparagraphe>Quant à la 2<exposant>de</exposant>*étape, fixée au 1<exposant>er</exposant>*janvier 2015 au plus tard, elle consiste en l’obligation, pour les instances chargées de la gestion du régime d’assurance chômage et des régimes de protection sociale complémentaire, de mettre en œuvre des dispositions utiles pour que les conventions et accords négociés tiennent compte de l’harmonisation des assiettes sociales.</texteparagraphe>
    					<texteparagraphe>
    						<annotation>
    							<titreannotation>Remarque*:</titreannotation>
    							<texteannotation>*une maquette du futur bulletin de paie simplifié a été présentée par le ministre du Travail le 19 mars dernier. Cette maquette se signale notamment par le regroupement de l’ensemble des cotisations sociales salariales et patronales.</texteannotation>
    						</annotation>
    					</texteparagraphe>
    				</paragraphe>
    </contenu>
    </chapitre>
    </article>
    le fichier 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
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="html"/>
     
    <xsl:template match="/">  
    <xsl:apply-templates select="//article"/>
    </xsl:template>
     
    <xsl:template match="article">
    	<xsl:value-of select="@idArticle" />
        <xsl:text>;;;</xsl:text>
        <xsl:value-of select="@rubrique" />
        <xsl:text>;;;</xsl:text>
        <xsl:value-of select="@dateArticle" />
        <xsl:text>;;;</xsl:text>
        <xsl:value-of select="./titrearticle"/>
        <xsl:text>;;;</xsl:text>
    	<xsl:value-of select="./chapitre/titrechapitre"/>
            <xsl:text>;;;</xsl:text>
      	    <xsl:for-each select="./chapitre/contenu/paragraphe/texteparagraphe">
        		  <xsl:value-of select="."/><xsl:element name="br"/>
       		 </xsl:for-each>
    	<xsl:text>&#xA;</xsl:text>
    </xsl:template>
     
    </xsl:stylesheet>
    Avec le xsl et du php, j'arrive à créer le fichier csv mais en observant le xml, dans ma boucle for-each qui s'occupe du nœud <texteparagraphe>, j'ai quelque fois des balises spéciale du genre <annotation><titreannotation> ou <exposant>. Quand je regarde le fichier csv,je me retrouve avec plein de caractère spéciaux qui malforme mon fichier csv et m'empêche dans un second traitement php d’insérer les données dans ma base mysql.

    Ma question: peut-on lors du traitement de xsl:for-each remplacer les balises <annotation><titreannotation> ou <exposant> par un saut de ligne ou une mise en italique ou bien les supprimer completement histoire d’éviter qu'en sortie le fichier ne soit plus exploitable en csv ?

    Un grand merci pour votre aide, je débute et manque de temps pour appronfondir mes connaissances sur xsl en ce moment.

  2. #2
    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
    Une question préliminaire :
    Si tu fais tout ça en PHP, pourquoi diable utilises-tu du XSLT ?
    Ça te semblerait pas un tout petit peu plus simple de transformer un XML en CSV avec PHP ?

    Citation Envoyé par Max1000p Voir le message
    Ma question: peut-on lors du traitement de xsl:for-each remplacer les balises <annotation><titreannotation> ou <exposant> par un saut de ligne ou une mise en italique ou bien les supprimer completement histoire d’éviter qu'en sortie le fichier ne soit plus exploitable en csv ?
    Une... "Mise en italique..." En CSV...
    Tu sais ce que c'est, du CSV ?
    Bon, je suppose que tu voulais dire comme tu mets des balises HTML <br> dans ton champ CSV pour indiquer que le champ est codé en HTML et qu'il y a un saut de ligne là.

    Le principe même de XSLT est de remplacer des balises par autre chose. Il suffit d'utiliser les templates.
    Tu peux :
    - D'abord remplacer value-of par apply-templates dans ton for-each :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:for-each select="chapitre/contenu/paragraphe/texteparagraphe">
      <xsl:apply-templates/>
      <br/>
    </xsl:for-each>
    C'est pareil mais plus simple et ça va permettre de traiter les balises que tu aimes pas.

    - Ajouter des templates pour traiter les balises spéciales.

    -- Juste faire comme si elles étaient pas là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="annotation | titreannotation | exposant">
      <!-- Et là on fait rien : donc on transmet pas leur contenu -->
    </xsl:template>
    -- Les entourer de <i></i>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="annotation | titreannotation | exposant">
      <i><xsl:apply-templates/></i>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 14
    Par défaut
    Merci thelvin, ça fonctionne, je comprends mieux le rôle des template et du apply dans la boucle.
    J'ai encore un soucis de récupération dans mon csv, un caractère spécial se glisse la ou les balises sont transformée en <i> par exemple.

    Excuse moi quand j'ai dit italique ou saut de ligne je pensé bien sûr à des balises Html <i> et <br>

    Pour le php sans le xslt, en fait j'ai 8 flux xml different au niveau du modèle à traiter et cette méthode xslt + php et simple quand on comprend bien sûr le xslt. Si demain il me colle un nouvel attribut, la feuille de style correspondante au modèle sera vite modifiée.
    J'ai essayé de parser le fichier en php avec SimpleXml mais le parcours de l'arbre, les boucles etc... ne sont pas évidente à traitées, pour moi bien sur...

    il ne me reste plus qu'à régler le problème du caractère spécial et tout sera fonctionnel.

  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
    Je comprends pas trop tes histoires de caractères spéciaux. Ce serait plus simple de nous montrer ce que tu obtiens, d'où ça sort et ce que tu voudrais à la place.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 14
    Par défaut
    Re Thelvin, déception, je n'arrive à rien faire de propre. Je n'arrive pas aujourd'hui avec cette méthode à obtenir un fichier csv propre pour l'envoyer via des requêtes php dans une base de données mysql.

    Tes explications m'ont permis de faire ce que je voulais sur la transformation mais la création du fichier pose des problèmes. étant donné que le fichier contient des caractères spéciaux, je ne peux pas l'exploiter correctement ensuite ... Je craque là ...

    Pour t'expliquer clairement, je lance mon fichier php qui va récupérer le xml d'origine sans le tag xsl, j'associe les deux fichiers et j'ecris ensuite dans mon fichier de sortie monfichier.csv.
    ci dessous mon fichier php, peut être que le problème proviens de la ??
    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
     
    <?php
     
    $xml_filename = "actuphoto.xml";
    $xsl_filename = "actu.xsl";
     
    $doc = new DOMDocument();
    $xsl = new XSLTProcessor();
     
    $doc->load($xsl_filename);
    $xsl->importStyleSheet($doc);
     
    $doc->load($xml_filename);
     
    echo $xsl->transformToXML($doc);
     
    $file = fopen('monfichierl.csv', 'w');
    fwrite($file,$xsl->transformToXML($doc));
    fclose($file);
     
    ?>
    Ensuite le xml d'origine et mon xslt avec les modifications pour modifier les balises ...

    Le résultat est un fichier csv, avec séparateur mais dans le csv, j'ai des espaces, saut de ligne et caractères spéciaux ... Du coup lorsque j'essaye de le lire ou l'ouvrir avec un while, puis un explode pour mettre chaque données parser dans mes variable php et ensuite faire une boucle pour injecter dans mysql, c'est la catastrophe ...

    Je sais plus trop quoi faire là, il me faut vraiment une solution pour transformer les xml en csv et pouvoir injecter dans du mysql ...

  6. #6
    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
    Je comprends vraiment pas ce que ça a de si compliqué de montrer ces fameuses lignes qui contiennent des caractères spéciaux et le XML qui les a générées.
    Ni d'expliquer ce que tu voudrais avoir à la place.
    Mais c'est toi qui vois.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. insérer un forum dans une page css dans une balise div
    Par scoubi77 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 08/07/2012, 21h31
  2. Repérer une balise XML dans une archive : problème avec zipgrep
    Par VforVincent dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 29/06/2011, 15h34
  3. Réponses: 8
    Dernier message: 26/03/2010, 08h16
  4. [XML][PHP]Extraire balise img dans une balise xml
    Par thierry232323 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/10/2006, 13h25
  5. problème xsl : inclure une donnée xml dans une balise html
    Par djodjo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/01/2003, 09h24

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