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 :

Boucle xsl:for-each provoque une erreur


Sujet :

XML/XSL et SOAP

  1. #1
    Futur Membre du Club
    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
    Points : 7
    Points
    7
    Par défaut Boucle xsl:for-each provoque une erreur
    Bonjour je débute en xslt et je rencontre quelques problème, votre aide serait la bienvenue. Voila ce que je tente de faire :
    1) je récupère un fichier xml avec une DTD
    2) je dois faire un script quotidien en php pour parser les articles dans le xml et les injecter dans une base mysql. J'ai choisi apres plusieurs essai non fructueux de transformer le xml avec un xsl et créer un fichier csv. Avec une deuxième tâche, j'injecte en php mon csv dans la base de donnée mysql.

    1ere étape, je ne touche pas les entête du fichier xml, j'utilise donc le php pour loader le xml + le xsl pour la transformation :
    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
     
    <?php
     
    $xml_filename = "actu.xml";
    $xsl_filename = "actu.xsl";
     
    $doc = new DOMDocument();
    $xsl = new XSLTProcessor();
     
    $doc->load($xsl_filename);
    $xsl->importStyleSheet($doc);
     
    $doc->load($xml_filename);
     
    $file = fopen('monfichier.csv', 'w');
    fwrite($file,$xsl->transformToXML($doc));
    fclose($file);
    ?>
    Grâce à ce fichier php, je génère un fichier csv en sortie avec les données récupérées et transformées au format csv : "";"";""

    Mon Xml ressemble à cela :
    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"?>
    <!DOCTYPE actu SYSTEM "dtdactu.dtd">
                <actu>
    <article idArticle="lea10019460" rubrique="social" dateArticle="30/05/2012">
    <titrearticle>Mise à jour du document unique d'évaluation des risques professionnels</titrearticle>
    <chapitre>
    <titrechapitre>Les TPE ne seront bientôt plus tenues de mettre à jour leur document unique d'évaluation des risques chaque année.</titrechapitre>
    <refchapitre>
    <lien href="http://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000025553296&amp;fastPos=1&amp;fastReqId=1495502912&amp;categorieLien=id&amp;oldAction=rechTexte#JORFARTI000025553676">Article 53, loi n° 2012-387 du 22 mars 2012, JO du 23</lien>
    </refchapitre>
    <contenu>
    <paragraphe>
    					<texteparagraphe>L’employeur doit prendre toutes les mesures nécessaires à la prévention des risques pour la santé et la sécurité de ses salariés. Dans ce cadre, le Code du travail lui impose de recenser dans un document, appelé « document unique », les risques présents dans l’entreprise et auxquels peuvent être exposés les salariés afin notamment de développer des actions de prévention.</texteparagraphe>
    					<texteparagraphe>Normalement, ce document doit être mis à jour au moins une fois par an, ainsi qu’à chaque décision d’aménagement modifiant les conditions de santé et de sécurité ou les conditions de travail, ou bien lorsqu’une information supplémentaire sur un risque est recueillie.</texteparagraphe>
    					<texteparagraphe>Cette fréquence annuelle ayant été jugée trop contraignante pour les TPE, la loi autorise désormais les entreprises de moins de 11 salariés à faire une mise à jour « moins fréquente », sous réserve toutefois qu’un niveau de protection de la santé et de la sécurité des travailleurs équivalent soit garanti.</texteparagraphe>
    					<texteparagraphe>Pour être applicable, cette mesure est cependant subordonnée à la publication d’un décret à paraître.</texteparagraphe>
    				</paragraphe>
    </contenu>
    </chapitre>
    </article>
    Et voila le XSL qui fonctionne partiellement :
    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
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" encoding="UTF-8"/>
     
    <xsl:template match="/">  
     <xsl:apply-templates select="//article"/>
    </xsl:template>
     
    <xsl:template match="article">
    	<xsl:text>"</xsl:text>
        <xsl:value-of select="./titrearticle"/>
    	<xsl:text>";"</xsl:text>
    	<xsl:value-of select="./chapitre/titrechapitre"/>
        <xsl:text>";"</xsl:text>
        <xsl:value-of select="./chapitre/contenu/paragraphe/texteparagraphe"/>
        <xsl:element name="br"/>
    	<xsl:text>"&#xA;</xsl:text>
    </xsl:template>
     
    </xsl:stylesheet>
    Je récupères donc les données qui m’intéresse dans les articles et j'obtiens bien en fichier formaté en csv.

    Mon problème, j'ai plusieurs élément dans le noeud /chapitre/contenu/paragraphe/texteparagraphe, le script ci-dessus va récupérer uniquement le premier texteparagraphe puis passe aux articles suivant. La balise element "br" est bien insérée dans le fichier, pour séparé les différents bloc texteparagraphe.

    J'ai donc essayé de mettre une boucle xsl:for-each sur mon élément /chapitre/contenu/paragraphe/texteparagraphe mais le script me colle une erreur.

    Voila le xsl qui plante avec l'erreur :
    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
     
    <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: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>
    J'ai ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Warning: DOMDocument::load() [domdocument.load]: Opening and ending tag mismatch: template line 8 and for-each in www/XML/actu.xsl, line: 16 in www/XML/book.php on line 9
     
    Warning: DOMDocument::load() [domdocument.load]: Opening and ending tag mismatch: stylesheet line 1 and template in www/XML/actu.xsl, line: 18 in www/XML/book.php on line 9
     
    Warning: DOMDocument::load() [domdocument.load]: Extra content at the end of the document in www/XML/book.php on line 9
     
    Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: compilation error in www/XML/book.php on line 10
     
    Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: xsltParseStylesheetProcess : empty stylesheet in www/XML/book.php on line 10
     
    Warning: XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]: No stylesheet associated to this object in www/XML/book.php on line 15
     
    Warning: XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]: No stylesheet associated to this object inwww/XML/book.php on line 18
    Je deviens fou, j'ai essayé de déplacer la boucle, mais rien n'y fait. Quelqu'un pourrait t-il éclairer ma lanterne, je pense que pas mal de personne serait intéressées par cette solution en php pour injecter des requêtes xml depuis un fichier csv correctement transformé.

    Merci pour votre aide

  2. #2
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Bonjour,

    il cinq caractères spéciaux en XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &amp;, &lt;, &gt;, &apos; et &quot ;
    c'est-à-dire qu'il faut écrire ces entités plutôt que le caractère en dur dans ton XML.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  3. #3
    Futur Membre du Club
    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
    Points : 7
    Points
    7
    Par défaut
    Bonjour polymorphisme,
    je ne comprends pas ta réponse. Je n'ai pas la main sur le XML, je le reçois comme cela et je dois le traiter pour les injection SQL avec le Php.

    Merci pour l'indication des caractères spéciaux, mais cela à t-il une incidence avec la boucle xsl:for-each qui ne fonctionne pas ?

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    J'ai testé et effectivement, y'a une erreur de syntaxe ici : <xsl:for-each select="./chapitre/contenu/paragraphe/texteparagraphe"/>.

    En virant le /, ça marche chez moi.

  5. #5
    Futur Membre du Club
    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
    Points : 7
    Points
    7
    Par défaut
    Un grand merci Loceka,
    en virant le "/" la boucle fonctionne. Je suis dégouté de pas l'avoir essayé mais cela va m'aider dans mon apprentissage du xslt. J'attaque maintenant la recherche d'attribut pour continuer à récupérer les informations dans le XML.

    Encore merci, je n'hésiterai pas à revenir si je rencontre d'autre soucis syntaxique ou autre ...

    Si quelqu'un est intéressé par ce mini tuto récupération xml avec du php + transformation en csv, je suis dispo pour fournir le reste du code avec les requête sur les attributs et autres arguments.

    J'ai bien galéré pour trouver cette solution et c'est avec plaisir que je la partagerai.

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

Discussions similaires

  1. Sortie de boucle for à cause d'une erreur
    Par hilibili dans le forum MATLAB
    Réponses: 1
    Dernier message: 07/07/2014, 21h14
  2. Comment transformer une balise xml dans une requete xsl:for-each
    Par Max1000p dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 07/06/2012, 09h46
  3. xsl:for-each avec un parametre pour select
    Par arnog dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/08/2008, 13h09
  4. boucle <xsl:for-each>
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 13/02/2006, 11h58
  5. Select Case provoque une erreur
    Par defluc dans le forum SQL
    Réponses: 6
    Dernier message: 14/08/2005, 23h59

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