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