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 :
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 : "";"";""
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); ?>
Mon Xml ressemble à cela :
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
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&fastPos=1&fastReqId=1495502912&categorieLien=id&oldAction=rechTexte#JORFARTI000025553676">Article 53, loi n° 2012-387 du 22 mars 2012, JO du 23</lien> </refchapitre> <contenu> <paragraphe> <texteparagraphe>Lemployeur 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 lentreprise 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 daménagement modifiant les conditions de santé et de sécurité ou les conditions de travail, ou bien lorsquune 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 quun 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 dun décret à paraître.</texteparagraphe> </paragraphe> </contenu> </chapitre> </article>
Je récupères donc les données qui m’intéresse dans les articles et j'obtiens bien en fichier formaté en csv.
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>"
</xsl:text> </xsl:template> </xsl:stylesheet>
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 :
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
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>"
</xsl:text> </xsl:template> </xsl:stylesheet>
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é.
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
Merci pour votre aide
Partager