Bonjour à tous,
voir ci-joint

je suis debutant en xml mais de toutes facons j'ai essai plusieur fois de faire ce tableau mais il s'affiche pas voila mon code et aider moi svp :
commerce.xml:


<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="xslcommerce.xsl"?>
<commerce>
<commande numc="1024" datec="03/01/2008" />
<commande numc="1025" datec="12/01/2008" />
<commande numc="1026" datec="16/01/2008" />
<commande numc="1027" datec="02/02/2008" />
<client numcli="123" nomcli="DUBOIS" adcli="Dijon"/>
<client numcli="123" nomcli="DUBOIS" adcli="Dijon"/>
<client numcli="124" nomcli="DUGENOU" adcli="Orléans"/>
<client numcli="125" nomcli="DURACUIRE" adcli="Bordeaux"/>
<article numA="10123" qte="20"/>
<article numA="12345" qte="50"/>
<article numA="10123" qte="30"/>
<article numA="34567" qte="25"/>
<article numA="65654" qte="20"/>
<article numA="12345" qte="15"/>
<representant numRep="10" nomRep="DUPUIS"/>
<representant numRep="11" nomRep="DUBALAI"/>
<representant numRep="12" nomRep="DUCHEMIN"/>
<representant numRep="12" nomRep="DUCHEMIN"/>
</commerce>

et le fichier xslcommerce.xsl

<?xml version="1.0" encoding="iso-8859-1"?><!-- DWXMLSource="commerce.xml" -->
<xsl:stylesheet xmlnssl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table>
<tr bgcolor="#FFFF00">
<td colspan="2">COMMANDE</td>
<td colspan="3">CLIENT</td>
</tr>
<tr>
<td>numC</td>
<td>DateC</td>
<td>numCli</td>
<td>nomCli</td>
<td>adCli</td>
</tr>
<xsl:for-each select="commerce/commande">
<tr>
<td><xsl:value-of select="@numc"/></td>
<td><xsl:value-of select="@datec"/></td>
<xsl:for-each select="commerce/client">
<td><xsl:value-of select="@adcli"/></td>
<td><xsl:value-of select="@nomcli"/></td>
<td><xsl:value-of select="@numcli"/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


le probleme que il affiche juste le premier tableau mais le deuxième non voila ce qui affiche:
COMMANDE CLIENT
numC DateC numCli nomCli adCli
1024 03/01/2008
1025 12/01/2008
1026 16/01/2008
1027 02/02/2008
mais ou le numcli et nom cli et adcli

aider moi pour ce probleme



aider moi svp please upload/18713-ig.jpg [code]
Modifié par manjava (11 Dec 2008 - 17:32)
Bonjour,

Déjà, il aurait été plus simple pour tout le monde que tu présentes ton code en le mettant en forme ainsi que cela est indiqué dans les règles du forum.

Je ne me prononcerai pas sur le code HTML en lui-même, qui est largement améliorable Smiley cligne

Ton problème est dû au fait que tu as imbriqué tes deux boucles for-each. Quand tu fais une boucle sur tes commerce/client, tu es déjà dans la boucle sur commerce/commande, donc le processeur XSLT cherche dans l'élément commande courant un descendant de la forme commerce/client, autrement dit, si l'on repart de la racine, un élément commerce/commande/commerce/client.

Je t'invite à regarder ce petit tuto pour en savoir plus...
Bonjour,
merci pour ce lien mais j'ai déjà connait j'arrive pas à resoudre mon probleme

Merci d'avance
Quand tu es à l'intérieur de la boucle sur commerce/commande, le noeud de référence est le noeud commande. C'est pour cela que tu peux directement écrire @numC par exemple. Par conséquent, tout appel à un noeud -élément ou attribut- doit se faire en prenant comme point de départ ce noeud commande. Pour revenir à l'élément racine, il te faut donc écrire <xsl:value-of select=".."/>. Pour aller au premier noeud commerce/client, il faut écrite <xsl:value-of select="../client[1]"/>. Quand tu écris, dans cette boucle, commerce/client, en fait tu pointes vers le noeud hypothétique commerce/commande/commerce/client, qui n'existe pas...

Est-ce que tu pourrais mettre en forme ton message en l'éditant puis en mettant en page le code? Merci!
Bonjour,

jusqu'a maintenant j'arrive pas à resoudre le probleme j'ai essai de de faire ce que vous dit mais aucun resultat

<xsl:for-each select="commerce/commande">
<tr>
<td><xsl:value-of select="@numc"/></td> 
<td><xsl:value-of select="@datec"/></td>
<td><xsl:value-of select="../client/nomcli"/></td> 
<td><xsl:value-of select="../client/numcli"/></td>
<td><xsl:value-of select="../client/adcli"/></td>
</tr>
</xsl:for-each>


Merci de m'aider
Bon, j'ai un peu plus de temps pour répondre.

Le problème, comme souvent, vient de la conception de la structure des données. Ici, à une commande doit être associé un client, une liste de produits, etc. Par conséquent, dans une première approche (il y a plus "propre", mais c'est un peu plus délicat à concevoir et j'en parlerai à la fin si j'ai le temps Smiley cligne ), l'élément client dépend de l'élément commande.

Du coup, le document XML doit ressembler plutôt à...

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="xslcommerce.xsl"?>
<commerce>
  <commande numc="1024" datec="03/01/2008">
    <client numcli="123" nomcli="DUBOIS" adcli="Dijon"/>
    <article numA="10123" qte="20"/>
    <article numA="12345" qte="50"/>
    <representant numRep="10" nomRep="DUPUIS"/>
  </commande>
  <commande numc="1025" datec="12/01/2008">
    <client numcli="123" nomcli="DUBOIS" adcli="Dijon"/>
    <article numA="10123" qte="30"/>
    <representant numRep="11" nomRep="DUBALAI"/>
  </commande>
  <commande numc="1026" datec="16/01/2008">
    <client numcli="124" nomcli="DUGENOU" adcli="Orléans"/>
    <article numA="34567" qte="25"/>
    <article numA="65654" qte="20"/>
    <representant numRep="12" nomRep="DUCHEMIN"/>
  </commande>
  <commande numc="1027" datec="02/02/2008">
    <client numcli="125" nomcli="DURACUIRE" adcli="Bordeaux"/>
    <article numA="12345" qte="15"/>
    <representant numRep="12" nomRep="DUCHEMIN"/>
  </commande>
</commerce>


Cela simplifie le fichier XSL, car la dépendance logique de client vis-à-vis de commande (qui ne fait que traduire la dépendance dans le monde réel) fait que l'on peut plus facilement imbriquer les boucles:

<xsl:for-each select="commerce/commande>
<tr>
  <td><xsl:value-of select="@numc"/></td> 
  <td><xsl:value-of select="@datec"/></td>
  <td><xsl:value-of select="client/[b][#red]@[/#][/b]nomcli"/></td> 
  <td><xsl:value-of select="client/[b][#red]@[/#][/b]numcli"/></td>
  <td><xsl:value-of select="client/[b][#red]@[/#][/b]adcli"/></td>
</tr>
</xsl:for-each>


J'ai mis en évidence le caractère @, nécessaire quand on veut accéder à l'attribut d'un élément, et que tu avais oublié.

Mais cela ne suffit pas, car pour ensuite donner la liste des produits, il faut les insérer. Je fais ça à l'arrache avec un tableau imbriqué (pour le faire plus proprement, il faudrait restructurer le tableau avec des rowspan, mais je me contente ici d'amender ton code, pas de le revoir en profondeur):

<xsl:for-each select="commerce/commande>
<tr>
  <td><xsl:value-of select="@numc"/></td> 
  <td><xsl:value-of select="@datec"/></td>
  <td><xsl:value-of select="client/@nomcli"/></td> 
  <td><xsl:value-of select="client/@numcli"/></td>
  <td><xsl:value-of select="client/@adcli"/></td>
  <td><table><xsl:for-each select="article">
    <tr>
      <td><xsl:value-of select="@numA" /></td>
      <td><xsl:value-of select="@qte" /></td>
    </tr>
  </xsl:for-each></table></td>
  <td><xsl:value-of select="representant/@numRep"/></td>
  <td><xsl:value-of select="representant/@nomRep"/></td> 
</tr>
</xsl:for-each>


Chose (à moitié) promise, chose due maintenant. Vu que des clients peuvent passer plusieurs commandes et qu'un représentant peut être à l'origine de plusieurs commandes, pour éviter les erreurs de saisie on peut créer l'équivalent d'une mini-base de données relationnelles en jouant avec des identifiants:

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="xslcommerce.xsl"?>
<commerce>
  <commande numc="1024" datec="03/01/2008" [#red]numcli="123"[/#] [#blue]numRep="10"[/#]>
    <article numA="10123" qte="20"/>
    <article numA="12345" qte="50"/>
  </commande>
  <commande numc="1025" datec="12/01/2008" [#red]numcli="123"[/#] [#blue]numRep="11"[/#]>
    <article numA="10123" qte="30"/>
  </commande>
  <commande numc="1026" datec="16/01/2008" [#red]numcli="124"[/#] [#blue]numRep="12"[/#]>
    <article numA="34567" qte="25"/>
    <article numA="65654" qte="20"/>
  </commande>
  <commande numc="1027" datec="02/02/2008" [#red]numcli="125"[/#] [#blue]numRep="12"[/#]>
    <article numA="12345" qte="15"/>
  </commande>
  <clients>
    <client idcli="123" idcli="DUBOIS" adcli="Dijon"/>
    <client idcli="124" nomcli="DUGENOU" adcli="Orléans"/>
    <client idcli="125" nomcli="DURACUIRE" adcli="Bordeaux"/>
  </clients>
  <representants>
    <representant idRep="10" nomRep="DUPUIS"/>
    <representant idRep="11" nomRep="DUBALAI"/>
    <representant idRep="12" nomRep="DUCHEMIN"/>
  </representants>
</commerce>

Évidemment, dans ce cas le fichier XSLT est à réécrire... mais les données sont plus "proprement" écrites (si on souhaitait écrire une DTD, on déclarerait des attributs de type ID et des IDREF...) Pour parfaire le travail, il faudrait écrire en fait 3 fichiers XML: un contenant les clients, le deuxième les représentants et le troisième les commandes, puis faire appel à la fonction document de XPath dans le XSLT.
Modifié par Gilles (12 Dec 2008 - 10:17)
Bonjour ,

merci beaucoup pour votre aide j'ai en train d'essai le code mais il affiche le message d'erreur suivant :
Le caractère < ne peut pas être utilisé dans une valeur d'attribut. Erreur de traitement de la ressource file:///C:/xampp/h...

<tr>
^


Merci Cordialement
Il y a peut-être une erreur de saisie, car en survolant le code, je ne vois pas de < dans les attributs.

Il est normal que ce caractère soit refusé s'il est présent, car tout comme >, &, et dans une moindre mesure ' et ", il a un sens en XML. Il faut le remplacer par une entité.

Il me semble qu'il serait sage que tu te poses quelque temps, le temps nécessaire pour revoir quelques bases de XML car un certain nombre d'erreurs que j'ai corrigées trahissent quelques manques...
Bonjour Gilles,

je fait le meme code mais il donne cette erreur
Attribut dupliqué. Erreur de traitement de la ressource file:///C:/xampp/htdocs/commerce2.xml. Ligne 34, Position 55

<client idcli="123" idcli="DUBOIS" adcli="Dijon"/>



Merci d'avance
Ah oui, tiens, oups, avec mon copier/coller j'avais raté un truc Smiley confused

On n'a pas le droit d'indiquer deux fois un même attribut dans un même élément, ainsi que cela t'est indiqué explicitement dans le rapport d'erreur que tu cites. Remplace le deuxième idcli (celui qui donne le nom) par nomcli (par exemple, nomcli="Dubois"). Ce sera de toute manière plus propre (parce qu'un nom de famille ne peut pas être un identifiant fiable, dans la mesure où tu peux avoir plusieurs clients avec le même patronyme...)

Une fois zencore, je t'invite fortement à reprendre les bases de XML, car il me semble que tu ne les maîtrises pas toutes...
Modifié par Gilles (15 Dec 2008 - 10:13)