Bonjour à tous !

J'ai besoin de vous, ça fait deux jours que j'essaie de comprendre le xsl sans succès !

Je voudrais transformer mon fichier xhtml en xml et je n'arrive même pas à accéder aux balises ! Donc pour le moment j'essaie déjà de le ressortir en html !

Mon fichier XML ressemble à ceci :
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en">
<head>
	<title>Titre page</title>
</head>
<body>
	<p>
		<span class="text_gras">Vous trouverez sur cette page des actualités régulièrement mises à jour.</span>
	</p>
	
	<table class="news_table">
	<tbody>
	<tr>
		<td nowrap="true" class="news_td">
			<span class="news_date">Juillet 2007</span> 
		</td>
		<td width="100%" class="news_title">  Fédération du BTP du Haut-Rhin </td>
	</tr>
	</tbody>
	</table>
</body>
</html>


Mon fichier XSL est le suivant :
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<html>
<body>
<table border="1" cellspacing="0" cellpadding="3">
<tr bgcolor="#FFFF00">
<td>Titre</td>
<td>Artiste</td>
</tr>
<xsl:for-each select="html/body">
<tr>
<td><xsl:value-of select="span"/></td>
<td>-</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template> 
</xsl:stylesheet>


Ensuite j'ai un fichier JAVA qui associe les deux...
ET le résultat est le suivant :

<html>
<body>
<table border="1" cellspacing="0" cellpadding="3">
<tr bgcolor="#FFFF00">
<td>Titre</td><td>Artiste</td>
</tr>
</table>
</body>
</html>


J'ai besoin d'aide ! Merci pour votre temps...

Julie
Bonjour,

Essaie déjà d'écrire <xsl:for-each select="/html/body">...</xsl:for-each>

De plus, l'élément span n'est pas un enfant direct de body, donc tu ne le trouveras pas non plus; essaie avec p/span (si tu souhaites accéder au premier élément span).

Mais je ne vois pas l'intérêt de faire une boucle sur les éléments body, alors qu'il n'y en a qu'un seul dans la page...
Tout d'abord merci pour ta réponse et ton temps !

Mais ça na change rien ! En effet un for each sur les élèments de body ne servent à rien, mais j'essaie tellement de choses que je ne vois même plus les absurdités !
Donc vu que je n'arrive à rien, je vais reprendre du début et me concentrer sur ce que je veux : un fichier XML en sortie.


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/html/body/p">
	<xsl:element name="p"><xsl:value-of select="span" /></xsl:element>
</xsl:template>
</xsl:stylesheet>


Et la ça me donne :

<?xml version="1.0" encoding="UTF-8"?>
	Titre page

		Vous trouverez sur cette page des actualités régulièrement mises à jour.

			Juillet 2007 

		  Fédération du BTP du Haut-Rhin 


Je ne comprends pas pourquoi il me met le texte de toutes les balises !
Modifié par Zulie (25 Nov 2008 - 11:27)
C'est normal. Quand tu charges le document XML, il essaie de l'afficher. Si tu ne spécifies aucun modèle (template) appliqué à l'ensemble du document, il l'affichera tel quel, avec le texte de toutes les balises.

Si tu souhaites remplacer ce contenu par défaut à l'affichage, il faut que tu appliques un modèle à l'ensemble du document avec un template match="/".

Quand tu écris match="/html/body/p", tu indiques que tu souhaites que ce template soit appliqué à tous les noeuds qui sont trouvables sous la forme /html/body/p, autrement dit les éléments p enfants directs de body, enfant direct de html, enfant direct de la racine.

Allez, je me fends d'un peu de pub Smiley lol Tu peux regarder ce chapitre d'initiation à XSLT, et quelques instructions XSLT un peu plus poussées...
Merci pour ta réponse Gilles !
J'ai suivi le chapitre d'initiation à XSLT et j'ai réussi parfaitement les exercices !

J'ai donc compris qu'il fallait tout d'abord mettre emplate match="/" pour que le fichier xsl s'applique sur le fichier XML en question !

Avec l'exemple des exercices j'ai essayé ceci mais ça ne fonctionne toujours pas, je crois que je suis vraiment nulle !!!!!

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
	<xsl:element name="contenu">
		<xsl:value-of select="//span"/>
	</xsl:element>
</xsl:template>
</xsl:stylesheet>


Cela devrait donc m'afficher :
<?xml version="1.0" encoding="UTF-8"?>
<contenu>Vous trouverez sur cette page des actualités régulièrement mises à jour.</contenu>


Au lieu de ça j'ai :
<?xml version="1.0" encoding="UTF-8"?>
<contenu/>


Comprends pas ! Smiley decu

Je suis vraiment désolée de vous faire perdre votre temps avec de si petites choses de débutant !
Bonjour,

Effectivement, cela semble étrange... mais il y a une explication. Et un «remède» Smiley smile

Déjà, ton fichier XHTML n'est pas valide :
# Il ne faut pas écrire "xmlns="http://www.w3.org/1999/ xhtml" avec un espace entre / et xhtml, mais "xmlns="http://www.w3.org/1999/xhtml"
# l'attribut nowrap ne peut prendre que la valeur nowrap

Pense aussi à changer tes lang="en" et xml:lang="en" en "fr": ton texte est en français, pas en anglais Smiley cligne .

Je ne me prononcerai pas plus sur le code initial. À chaque jour suffit sa peine Smiley smile .

Revenons à la feuille de style. Si on supprime le DOCTYPE et qu'on remplace <html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en"> par un simple <html>, la feuille de style marche sans problème, tu peux le vérifier. Pourquoi? Parce que quand tu spécifies un espace de nom comme c'est le cas, à chaque fois que tu fais appel à un élément comme par exemple span, tu te réfères à cet espace de nom. Quand tu écris ta feuille de style, les requêtes XPath doivent pouvoir retrouver ces mêmes références. Cela n'est pas évident car tu as indiqué un espace de noms par défaut (en écrivant xmlns= et pas xmlns:html= par exemple). Si tu avais écrit xmlns:html="http://www.w3.org/1999/xhtml" au lieu de xmlns="http://www.w3.org/1999/xhtml", tu aurais dû à chaque fois préfixer tes noms d'éléments et d'attributs html par html:, en écrivant par exemple

<html:span html:class="news_date">Juillet 2007</span> 

C'est un peu lourd certes Smiley smile ... Dans ce cas, tu te serais dit que dans la feuille de style, il aurait fallu écrire par exemple <xsl:value-of select="//html:span"/>. Or ici tu n'utilises pas de préfixe dans ton fichier XHTML initial pour les éléments et attributs de l'espace de noms XHTML. L'espace de noms est certes implicite, mais il existe quand même: c'est pour cela qu'il faut le respécifier dans la feuille de style. Tu peux écrire par exemple

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:html="http://www.w3.org/1999/xhtml>
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
	<xsl:element name="contenu">
		<xsl:value-of select="html:html/:html:body/html:p/html:span"/>
	</xsl:element>
</xsl:template>
</xsl:stylesheet>


Normalement cela devrait marcher Smiley smile
Modifié par Gilles (26 Nov 2008 - 09:35)