bonjour,
je m'essaye à la transformation XML ...

mon fichier XML est :

<?xml version="1.0" encoding="UTF-8"?>
<distrib>
	<info>
		<nom>changelog</nom>
		<url>/changelog/</url>
	</info>
	<info>
		<nom>download</nom>
		<url>/download/</url>
	</info>
	<info>
		<nom>commander</nom>
		<url>http://ikarios.com/form#knoppix</url>
	</info>
</distrib>


le fichier XSL :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="info">
		=&gt; <a href=""><xsl:value-of select="nom"/></a><br />
	</xsl:template>
</xsl:stylesheet>


je parse le tout en PHP avec ce bout de code :

<p>
		<?php
		
		$xml_entry = xslt_create();
		$xml_out = xslt_process($xml_entry, XMLS.'/version.xml', XMLS.'/version.xsl');
		xslt_free($xml_entry);
		
		echo $xml_out;
		?>
		</p>


Mon premier soucis est qu'il m'écrit dedans la déclaration XML (<?xml version="1.0" encoding="UTF-8"?>) , ce qui a la facheuse tendance de planter mon flux xhtml et donc de me sortir une belle page jaune d'erreur ...
(cf ma page de dev)
Idem si en lieu et en place d'en faire une sortie par variable je modifie mon code PHP pour en faire une sortie fichier que j'inclue ensuite ...

Mon deuxième problème est : comment puis-je inclure la valeur 'url' dans l'attribut href ?

merci d'avance .
Modifié par ste (12 Sep 2006 - 17:33)
Bonjour,

pour supprimer la déclaration xml tu doit utiliser la balise output

<xsl:output method="xml" omit-xml-declaration="yes" media-type="text/xml" />


Cela devrait arranger les choses ...

Pour mettre la valeur url utilise la syntaxe {url} cela devrait fonctionner (de mémoire).
2bass a écrit :
Bonjour,

pour supprimer la déclaration xml tu doit utiliser la balise output

<xsl:output method="xml" omit-xml-declaration="yes" media-type="text/xml" />


Cela devrait arranger les choses ...


C'est le cas ... je te remercie.

a écrit :

Pour mettre la valeur url utilise la syntaxe {url} cela devrait fonctionner (de mémoire).

Désolé, là, je ne te comprends pas.
Smiley biggol
ste a écrit :


C'est le cas ... je te remercie.


Pour mettre la valeur url utilise la syntaxe {url} cela devrait fonctionner (de mémoire).

Désolé, là, je ne te comprends pas.
Smiley biggol

En fait, si j'ai compris ...
et, en effet, ça "marche"...

Si en lieu et place, je veux utiliser l'attribut XML qu'est xlink:href ?
(pendant ce temps, je cherche ...)
Modifié par ste (11 Sep 2006 - 23:00)
ste a écrit :
Si en lieu et place, je veux utiliser l'attribut XML qu'est xlink:href ?
(pendant ce temps, je cherche ...)


{@xlink:href} ? Smiley murf
2bass a écrit :


{@xlink:href} ? Smiley murf


Non, j'ai essayé ... et, j'obtiens une erreur Sablotron.

Pour reprendre ma nouvelle question est :
si j'écris mon code XML ainsi :
<info xlink:href="/changelog/">changelog</info>


quelle est l'écriture XSLT qui me permet de restituer correctement l'élément a ?
Modifié par ste (12 Sep 2006 - 10:18)
Ah ... tu peux toujours essayer ceci


<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="@xlink:href" />
</xsl:attribute>
<xsl:value-of select="." />
</xsl:element>


Si le match du template est bien sur info ...
je suis vraiment désolé... mais c'est toujours pas bon !

et, oui, c'est toujours le meme match template.

Je "tournais" autour d'une solution assez similaire, mais résultat idem; toujours erreur sablotron, donc échec.
J'ai pas vu l'erreur que te donne sablotron mais as tu penser à déclarer l'espace de nom dans ton fichier xsl ? Ce pourrais être ça ...
2bass a écrit :
J'ai pas vu l'erreur que te donne sablotron mais as tu penser à déclarer l'espace de nom dans ton fichier xsl ? Ce pourrais être ça ...


je l'ai écrit ainsi :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" media-type="text/html" />
	<xsl:template match="info" xmlns:xlink="http://www.w3.org/1999/xlink">
		=> <xsl:element name="a">
				<xsl:attribute name="href">
					<xsl:value-of select="@xlink:href" />
				</xsl:attribute>
				<xsl:value-of select="nom" />
			</xsl:element><br />
	</xsl:template>
</xsl:stylesheet>


quant à mon fichier xml:
<?xml version="1.0" encoding="UTF-8"?>
<distrib>
	<info xlink:href="/changelog/" xmlns:xlink="http://www.w3.org/1999/xlink">changelog</info>
	<info xlink:href="/download/" xmlns:xlink="http://www.w3.org/1999/xlink">download</info>
	<info xlink:href="http://ikarios.com/form#knoppix" xmlns:xlink="http://www.w3.org/1999/xlink">commander</info>
</distrib>
Bien je t'ai modifié tes fichiers ...

Déclare ton espace de nom une seule fois, c'est plus rapide


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

<distrib  xmlns:xlink="http://www.w3.org/1999/xlink">

	<info xlink:href="/changelog/">changelog</info>

	<info xlink:href="/download/">download</info>

	<info xlink:href="http://ikarios.com/form#knoppix">commander</info>

</distrib>


Pour la feuille de style déclare directement l'espace de nom sur l'élément racine. Et pour que le lien se remplisse il faut lui dire de prendre la valeur courante du noeud => .


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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="yes" media-type="text/html" xmlns:xlink="http://www.w3.org/1999/xlink" />

	<xsl:template match="info" >

		 <xsl:element name="a">

				<xsl:attribute name="href">

					<xsl:value-of select="@xlink:href" />

				</xsl:attribute>

				<xsl:value-of select="." />

			</xsl:element>
                        <br />

	</xsl:template>

</xsl:stylesheet>


Voila Smiley lol
je suis vraiment désolé, mais j'ai toujours une erreur sablotron ...
Warning: Sablotron error on line 7: invalid namespace prefix 'xlink:href' in /version.php on line 14

et, c'est pareil si je mets en lieu et place {attribute::xlink:href} ...
Bon, j'y suis enfin arrivé ! Smiley lol

Il a fallu que je modifie le fichier XSL ainsi :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
	xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:output method="xml" omit-xml-declaration="yes" media-type="text/html" />
	<xsl:template match="info" >
		=&gt; <a>
			<xsl:attribute name="href">
				<xsl:value-of select="@xlink:href" />
			</xsl:attribute>
			<xsl:apply-templates/>
		</a><br />
	</xsl:template>
</xsl:stylesheet>


Il me transforme bien le fichier XML en flux html Smiley langue

Juste une dernière chose, dans la transformation XSLT, il ajoute dans les éléments l'attribut xmlns:xlink et sa valeur ... une idée pour l'empêcher de rajouter cette écriture ?!
Modifié par ste (12 Sep 2006 - 16:21)
C'est plutôt bizarre que ce n'est pas fonctionné, j'ai testé chez moi. Ce n'est pas le même processeur xslt mais quand même.

Sinon pour enlever les attributs j'avais trouvé une astuce, mais en fouillant dans mes fichiers je n'ai rien trouvé ... désolé.
2bass a écrit :

Sinon pour enlever les attributs j'avais trouvé une astuce, mais en fouillant dans mes fichiers je n'ai rien trouvé ... désolé.


J'ai trouvé !!! Smiley lol

Il suffit de rajouter l'attribut exclude-result-prefixes="xlink" dans la declaration xsl:stylesheet.

Yeahaahhh... Smiley langue