Salut,

Mon titre n'est pas peut-être pas clair alors voilà :
Après une heure (au moins) de recherche sur le www, je viens à vous pour trouver une solution à un truc dans le genre

<xsl:if test="truc = document('machin.xml')//noeud[@attribut]" />
...
</xsl:if>

Clairement, je voudrais afficher quelque chose si la valeur du noeud TRUC dans mon XML de base est égale à la valeur de l'attribut du noeud dans l'autre fichier XML 'machin.xml' !

HELP !
Modifié par ashmex (19 May 2006 - 16:14)
ashmex a écrit :
Salut,

Mon titre n'est pas peut-être pas clair alors voilà :
Après une heure (au moins) de recherche sur le www, je viens à vous pour trouver une solution à un truc dans le genre

<xsl:if test="truc = document('machin.xml')//noeud[@attribut]" />
...
</xsl:if>

Clairement, je voudrais afficher quelque chose si la valeur du noeud TRUC dans mon XML de base est égale à la valeur de l'attribut du noeud dans l'autre fichier XML 'machin.xml' !

HELP !


Je pense que le problème vient de la manière dont tu récupères la valeur de l'attribut dans ton élément: c'est noeud/@attribut et non noeud[@attribut]... De plus, <xsl:if> n'est pas un élément vide...


<xsl:if test="truc=document('machin.xml')//noeud/@attribut">
...
</xsl:if>



PS: Tu peux encadrer ton code de [ code ] et [ /code ] (sans les espaces) pour le mettre en forme.
Modifié par Gilles (19 May 2006 - 15:58)
J'ai edit le premier poste. Vive le jaune ci.tr.on 2.0 !

J'ai tenté le coup de l'attribut... Bof
Mais, qu'entends-tu par
a écrit :
<xsl:if> n'est pas un élément vide
?? Parce que l'erreur qui m'est annoncée est en relation avec mes balises, du genre il attendait une </td> plutot qu'un </xsl:if> ...

Mon problème est peut-être ici... ?
ashmex a écrit :
J'ai edit le premier poste. Vive le jaune ci.tr.on 2.0 !

J'ai tenté le coup de l'attribut... Bof
Mais, qu'entends-tu par <xsl:if> n'est pas un élément vide
?? Parce que l'erreur qui m'est annoncée est en relation avec mes balises, du genre il attendait une </td> plutot qu'un </xsl:if> ...

Mon problème est peut-être ici... ?

Si tu as fait un copier/coller du code de ta page, alors il y a une erreur, puisque tu as écrit :

<xsl:if test="truc = document('machin.xml')//noeud[@attribut]" />
Utilises-tu un processeur XSLT pour la transformation ?

Avec xsltProcessor, je n'ai jamais réussi à utiliser la fonction document() et j'ai cru comprendre sur des forums que ce n'était tout simplement pas possible /supporté.
Tu peux utiliser la fonction "document()" avec les deux transformateurs
de php. LibXML2,Sablotron,IE et FF.

Il est préferable d'inialisé au debut de ton document XSLT.
ATTENTION au chemin relatif ou absolu du document.
Regarder ou se trouve votre code XSLT et le code XML.
Utiliser un chemin complet ou avec "../" pour remonter dans une arborescence.


<xsl:variable name="dico" value="document('xml/dico.xml')/dico">


Ou selectionné dynamiquement un document


<xsl:param name="lang"/>
<xsl:variable name="dico" select="document(concat('xml/',$lang,'/dico.xml'))/dico">


Par la suite utilise la variable "$dico" comme pointeur sur ce document XML.


<xsl:if test=$dico[@id='123456']>
........
</xsl:if>


Un test conditionnel doit toujours avoir du code entre ces deux balises.
Je conseille d'utiliser un "Template"
Eviter d'utilisé les "xsl:if" et "xsl:foreach" dans la mesure du possible.

Exemple de code avec une template.


<xsl:apply-templates select="$dico[@id='1']" mode="dico"/>


<xsl:template match="dico[@id='1']" mode="dico">
......
</xsl:template>

<xsl:template match="dico[@id='2']" mode="dico">
......
</xsl:template>

<xsl:template match="dico/@id" mode="dico">
......
</xsl:template>


Pour ton exemple.

<xsl:variable name="dico" value="document('xml/dico.xml')/dico">

<xsl:if test="$dico[@id=current()/Truc]">
........
</xsl:if>



Mais le mieux serait:


<xsl:variable name="dico" value="document('xml/dico.xml')/dico">

<xsl:apply-templates select="$dico[@id=current()/Truc]" mode="dico"/>

<xsl:template match="dico/@id" mode="dico">
......
</xsl:template>


Regarde la doc sur Xpath

Bon courrage. Smiley cligne
Modifié par sylvain38 (28 May 2006 - 12:40)