[XML XLMS] Somme d'un produit

bubuze Messages postés 31 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 25 avril 2006 - 18 juin 2005 à 18:06
bubuze Messages postés 31 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 25 avril 2006 - 19 juin 2005 à 11:08
Bonjour !



Désolé si je ne suis pas dans le bon site/forum, mais n'ayant rien
trouvé pour xml, et développant un site xml/xls/javascript, je
m'inscruste ici :-)


j'avance pas à pas en xml/xsl -> html, dans le but de créer des galeries de photos...





pour chaque paragraphe, j'insère un nombre variable d'images :



Code:, ----
<!ELEMENT paragraphe (posparag,info,image+,commentaire*)>

<!ATTLIST paragraphe pos_page ID #REQUIRED>

<!ELEMENT info (#PCDATA)>

<!ELEMENT image (#PCDATA)>

<!ATTLIST image l_orig NMTOKEN #REQUIRED h_orig NMTOKEN #REQUIRED>

<!ELEMENT commentaire (auteur,texte,jour,mois,année)>




si je veux retailler les images pour qu'elles s'affichent sur une ligne,


j'ai une solution ($larg_page est la largeur imposée de la page) :



Code:, ----
<xsl:variable name="larg_imgs">

<xsl:value-of select="sum(image/@l_orig)" />

</xsl:variable>

<xsl:for-each select="image">

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

<xsl:attribute name="width"><xsl:value-of
select="number(@l_orig * $larg_page div $larg_imgs)"
/></xsl:attribute>

<xsl:attribute name="height"><xsl:value-of
select="number(@h_orig * $larg_page div $larg_imgs)"
/></xsl:attribute>

<xsl:text> </xsl:text>

</xsl:for-each>






Maintenant, si je veux améliorer cet affichage, et faire en sorte
que les images aient la même hauteur, et soient toujours affichés sur
une largeur imposée, ça se complique, j'ai maintenant besoin de la
somme des rapports hauteur/largeur des images.


et bien sûr, le code suivant serait trop simple :



Code:, ----
<!-- A MARCHE PAS -->

<xsl:variable name="larg_imgs">

<xsl:value-of select="sum(image/@l_orig div image/@h_orig)" />

</xsl:variable>



j'ai essayé pas mal d'autres formulations, jusqu'à recréer une
variable node avec en éléments les rapports l/h, mais je ne crois pas
avoir le droit d'en calculer la somme :



Code:, ----
<!-- A MARCHE PAS -->

<xsl:variable name="test" >

<racine>

<xsl:for-each select="image">

<element>

<xsl:value-of select="number(@l_orig div @h_orig)" />

</element>

</xsl:for-each>

</racine>

</xsl:variable>

<xsl:value-of select="sum($test)" />







si quelqu'un avait la solution pour me débloquer ce serait achement sympa.


(ce problème correspondrait aussi bien à calculer le montant d'une facture


à partir d'un nbre d'articles et de leur prix unitaires)





Merci !





PS :

pour ceux que ça intéresse, à partir de n images, pour les afficher
sur sur largeur X, et qu'elles aient la même hauteur sans modifier leur
ratio h/l


x'i = (xi / yi ) * (X / (somme[1..n](xi/yi)))


y'i = yi * x'i / xi

2 réponses

bubuze Messages postés 31 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 25 avril 2006
19 juin 2005 à 01:40
Une bonne galère c'te question...

j'ai fini par trouver grâce à l'ébauche de la faq

[url]http://www.developpez.net/forums/viewtopic.php?t= 90007/url

Donc merci à grégory.



pour les débutants qui tomberaient ici, je vais essayer d'expliquer la solution,

pour les pros, vos commentaires, conseils et corrections seront gratifiés :



DTD simplifiée :



















Exemple xml :











exemple3.jpg

exemple4.jpg

exemple5.jpg






exemple1.jpg

exemple1.jpg

exemple1.jpg






Info du paragraphe3

exemple2.jpg

exemple2.jpg













Contraintes :



Le paragraphe

doit contenir toutes les images sur une ligne

La largeur du paragraphe est imposée ($larg_page)

La hauteur des images sera identique

Le ratio hauteur/largeur des images ne doit pas être modifié





Après un bon moment passé sur papier, j'abouti au résultat suivant :



l_new = (l_orig * larg_page) / (h_orig * tot_ratio)

h_new = (l_new * (h_orig / l_orig)

avec tot_ratio = somme de tous les rapports (l_orig / h_orig)





La difficulté vient principalement de ce calcul tot_ratio,

qui ne peut être réalisé simplement avec un



"sum(@l_orig div @h_orig)"





D'après grégory, la seule solution est la méthode itérative

(puisqu'une xls:variable est en fait une constante :-/)



Plongeons et creusons pas à pas notre trou (ou plutôt résultat) :

Le principe consiste à calculer le ratio de la première image,

puis de le "transmettre" à l'image suivante, qui l'additionnera

à son propre ratio avant de l'envoyer à l'image d'après.



Lorsqu'il n'y a plus d'image, il n'y a plus de ratio à calculer,

on affiche alors la valeur qui a été transmise par l'image précédente,

(qui était logiquement la dernière du paragraphe).



Techniquement, on utilisera une fonction avec deux paramètres :

- la somme des ratios envoyée par l'image précédente

- la "référence" de l'image courante, celle qu'il faut traiter



























La fonction doit être capable de lire la largeur et la hauteur de l'image courante :

Rq : on prendra soin d'appeler cette fonction à partie d'un noeud parent de image,

donc à partir de paragraphe dans notre cas.











Mais que se passe-t-il si la position à laquelle nous nous trouvons ne correspond plus à une image ?

Nous renverrons le résultat !

Il va falloir tester cette condition :

























Dans le cas général, il faudra calculer le ratio de l'image courante,
l'additionner à la somme des ratios des images précédentes, et
transmettre le tout à l'image suivante (qu'elle existe ou pas, nous
avons vu que si elle n'existe pas, on prend alors la décision de
renvoyer le résultat) :

c'est là qu'intervient la récursivité, nous sommes dans une fonction et nous rappelons cette même fonction,

mais avec des paramètres qui auront évolués (le $total a changé, et la position est incrémentée) :















Dans le cas final, on se contente d'afficher le total passé en paramètre

(pour les sceptiques : ça marche !)









Assemblons le tout :








































































La fonction est maintenant écrite, reste à l'initialiser, au bon moment et au bon endroit :



Dans mon cas, mon fichier xsl commence par définir une "variable" :

puis traite la racine du xml, et se termine par notre fonction :









900





































C'est bien sûr dans le corps du html que nous ferons notre appel à la fonction.

Tout d'abord c'est un traitement à réaliser indépendamment, pour chaque paragraphe :











(Rq : vous aurez probablement à traiter chaque page avant de traiter chaque paragraphe,

hors sujet dans notre cas)





Dans chaque paragraphe, nous commençons par calculer ce fameux total_ratio,

on confirme, on vérifie qu'on est bien sur le noeud parent de "image",

on peut lancer notre calcul itératif :





0

1







Le résultat s'affiche à l'écran, et si je veux le stocker ?

Aussi incroyable que ça puisse paraître, tout simplement :







0

1









Voilà c'est tout !

Je ne me défausse pas pour autant, on a bien envie de les voir bien rangées ces images ?

Nous devons les mettre dans un paragraphe :













Nous sommes toujours sur le noeud "parapraphe", et nous allons afficher chaque image :













Calculons la largeur et la hauteur modifiée de cette image

(d'après la formule du début et le désormais fameux total_ratio) :





















Et affichons cette image, suivie d'un espace pour les séparer "proprement" :





























Bon ben c'est fini ?



Reste plus qu'à tout recomposer (mettez tout dans le même répertoire) :



exemple.dtd



















exemple.xml :

















exemple3.jpg

exemple4.jpg

exemple5.jpg






exemple1.jpg

exemple1.jpg

exemple1.jpg






exemple2.jpg

exemple2.jpg













exemple.xsl :









900























0

1





































































































































0
bubuze Messages postés 31 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 25 avril 2006
19 juin 2005 à 11:08
Pas mal d'erreurs, et je ne sais pas éditer les messages :-/

Allez voir là (en attendant que je fasse un vrai code source)

http://www.javascriptfr.com/forum.v2.aspx?ID=489814
0
Rejoignez-nous