Bonjour,

Dans le cadre de la creation d'un site de vente en ligne utilisant xml, je voudrais pouvoir executer une transformation xslt sur base de deux fichiers xml.

Mon premier fichier xml contient les produits
<produits>
<produit cat="2">
<nom>monproduit</nom>
</produit>
</produits>


Mon deuxieme fichier xml contient les categories de produits
<categories>
<categorie num="2">
<nom>macategorie</nom>
</categorie>
</categories>


ce ne sont evidemment pas mes fichiers reels, je n'ai mis qu'une occurence pour simplifier

Comment puis je faire dans un fichier xsl, pour connaitre le numero de categorie a partir du numero de produit par exemple?

Merci
Modifié par neus³ (14 Feb 2006 - 14:49)
Tu peux utiliser la fonction document(), dont tu pourras trouver la description dans cette recherche sur le forum.

ça doit être une mode, en ce moment... ce sujet d'habitude rare ressort très souvent Smiley hum
Ma première solution était de faire deux transformations, une pour recupérer le numéro de categorie du produit, puis une seconde pour récupérer les informations de la categorie, mais je trouve ca lourd...

Je me dis qu'il doit etre possible de tout faire en une seule transformation mais je vois pas...

Il y a certainement des surdoués parmi vous qui pourront répondre à ma question...
Eh bien... tu commences par copier dans une variable le numéro de catégorie de ton produit (ici <produit> est l'élément courant):

<xsl:variable name="numCat" select="@num" />

puis tu accèdes à ton second fichier en faisant un test:

<xsl:value-of select="document('mescategories.xml')/categories/categorie[@num=$numCat]" />


Ou quelque chose du même genre...
Modifié par Gilles (14 Feb 2006 - 18:27)
A l'aise ca marche Smiley cligne Merci beaucoup

Mais ca ne fonctionne bien que lorsque le fichier xml inclus est dans le meme repertoire que le fichier xsl.

Dans mon schema de dossier, j'ai :
-XML
--categories
---categories.xml
--produits
---produits.xml
---monxsl.xsl


Lorsque je fais :
<xsl:variable name="cats"><xsl:value-of select="document(..\categories\categories.xml,categories)"/></xsl:variable>
<xsl:template match="/">
<xsl:copy-of select="$cats"/>
</xsl:template>


Je n'obtiens que le contenu du fichier xml, c'est a dire le contenu hors balise (les balises ne sont pas incluses...).

Pourquoi?
Les "\" ne désignent une arborescence que sous Windows. Il faut les remplacer par des "/":


<xsl:variable name="cats" select="document(../categories/categories.xml)/categories"/>
<xsl:template match="/">
<xsl:copy-of select="$cats"/>
</xsl:template>


Tu remarqueras que j'ai aussi corrigé deux ou trois autres détails:
- après document(), ll faut mettre un / pour commencer à inspecter la racine du fichier XML que tu viens de sélectionner.
- j'ai enlevé une virgule dans ton code (dans le document()).
- il vaut mieux utiliser variable tel que je le fais: c'est plus "moderne", et probablement un peu plus rapide (il n'y a qu'une commande xsl à interpréter au lieu de deux)

De plus, ta variable $cats désigne effectivement le contenu de ces éléments sélectionnés. Ce n'est pas un ensemble de noeuds. Pourquoi n'essaies-tu pas de faire l'ensemble en une seule passe?

<xsl:template match="/">
<xsl:copy-of select="document(../categories/categories.xml)/categories"/>
</xsl:template>

Modifié par Gilles (15 Feb 2006 - 08:42)