Accueil > Forum > > > > [XML XLMS] Somme d'un produit
[XML XLMS] Somme d'un produit
samedi 18 juin 2005 à 18:06:14 |
[XML XLMS] Somme d'un produit

bubuze
|
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">
<img alt="marche pas">
<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>
</img>
<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>
<p>
<xsl:value-of select="sum($test)" />
</p>
|
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
|
|
dimanche 19 juin 2005 à 01:40:07 |
Re : [XML XLMS] Somme d'un produit

bubuze
|
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 :
[code]
<!ELEMENT site (parametres,page+)>
<!ELEMENT page (paragraphe+)>
<!ELEMENT paragraphe (image+)>
<!ATTLIST paragraphe pos_page ID #REQUIRED>
<!ELEMENT image (#PCDATA)>
<!ATTLIST image l_orig NMTOKEN #REQUIRED h_orig NMTOKEN #REQUIRED>
[/code]
Exemple xml :
[code]
<!DOCTYPE librairie SYSTEM "generique.dtd">
<site>
<page>
<paragraphe pos_page="ab2">
<image l_orig="600" h_orig="398">exemple3.jpg</image>
<image l_orig="600" h_orig="511">exemple4.jpg</image>
<image l_orig="600" h_orig="426">exemple5.jpg</image>
</paragraphe>
<paragraphe pos_page="ab1">
<image l_orig="600" h_orig="404">exemple1.jpg</image>
<image l_orig="600" h_orig="404">exemple1.jpg</image>
<image l_orig="600" h_orig="404">exemple1.jpg</image>
</paragraphe>
<paragraphe pos_page="ab3">
<info>Info du paragraphe3</info>
<image l_orig="600" h_orig="180">exemple2.jpg</image>
<image l_orig="600" h_orig="180">exemple2.jpg</image>
</paragraphe>
</page>
</site>
[/code]
Contraintes :
[code]
Le <p>paragraphe</p> 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é
[/code]
Après un bon moment passé sur papier, j'abouti au résultat suivant :
[code]
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)
[/code]
La difficulté vient principalement de ce calcul tot_ratio,
qui ne peut être réalisé simplement avec un
[code]
"sum(@l_orig div @h_orig)"
[/code]
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
[code]
<!-- Définition de la fonction -->
<xsl:template name="somme_ratios">
<!-- et ses deux paramètres -->
<xsl:param name="total"/>
<xsl:param name="position"/>
<!-- Ici viendra l'implémentation de la fonction -->
</xsl:template>
[/code]
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.
[code]
<xsl:variable name="largeuri"><xsl:value-of select="image[position()=$position]/@l_orig"/></xsl:variable>
<xsl:variable name="hauteuri"><xsl:value-of select="image[position()=$position]/@h_orig"/></xsl:variable>
[/code]
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 :
[code]
<xsl:choose>
<xsl:when test="$position <= count(image)">
<!-- en clair : test="$position <= count(image)", ou encore
notre position
actuelle est-elle inférieure ou égale au nombre d'images de ce
paragraphe ? -->
<!-- C'est le cas général, il y a une image à cette position -->
</xsl:when>
<xsl:otherwise>
<!-- Sinon, il n'y a plus d'image, on renvoie le résultat -->
</xsl:otherwise>
</xsl:choose>
[/code]
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) :
[code]
<xsl:call-template name="somme_ratios">
<xsl:with-param name="total"><xsl:value-of select="$total+$largeuri div $hauteuri"/></xsl:with-param>
<xsl:with-param name="position"><xsl:value-of select="$position+1"/></xsl:with-param>
</xsl:call-template>
[/code]
Dans le cas final, on se contente d'afficher le total passé en paramètre
(pour les sceptiques : ça marche !)
[code]
<xsl:value-of select="$total"/>
[/code]
Assemblons le tout :
[code]
<!-- définition de la fonction et de ses deux paramètres -->
<xsl:template name="somme_ratios">
<xsl:param name="total"/>
<xsl:param name="position"/>
<!--Dans quel cas somme-nous ? -->
<xsl:choose>
<!-- 1: oui, il existe une image -->
<xsl:when test="$position <= count(image)">
<!-- définition des deux variables
largeur et hauteur (lecture d'attributs) -->
<xsl:variable name="largeur_i">
<xsl:value-of select="image[position()=$position]/@l_orig"/>
</xsl:variable>
<xsl:variable name="hauteur_i">
<xsl:value-of select="image[position()=$position]/@h_orig"/>
</xsl:variable>
<!-- calcul du ratio l/h de cette image -->
<xsl:variable name="ratio_i">
<xsl:value-of select="number($largeuri div $hauteuri)"/>
</xsl:variable>
<!-- puis on passe à l'image suivante, en mettant à jour les paramètres
<xsl:call-template name="somme_ratios">
<xsl:with-param name="total">
<xsl:value-of select="$total+$ratio_i"/>
</xsl:with-param>
<xsl:with-param name="position">
<xsl:value-of select="$position+1"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<!-- 2:Sinon, cas final, plus d'image, on "affiche" le résultat -->
<xsl:otherwise>
<xsl:value-of select="$total"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
[/code]
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 :
[code]
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="larg_page">900</xsl:variable>
<xsl:template match="/">
<html>
<head>
<!-- La partie en-tête -->
</head>
<body class="defaut">
<!-- Le corps -->
</body>
</html>
</xsl:template>
<xsl:template name="somme_ratios">
<!-- La fonction décrite ci-dessus -->
</xsl:template>
</xsl:stylesheet>
[/code]
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 :
[code]
<xsl:for-each select="site/page/paragraphe">
<!-- ... -->
</xsl:for-each>
[/code]
(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 :
[code]
<xsl:call-template name="somme_ratios">
<xsl:with-param name="total">0</xsl:with-param>
<xsl:with-param name="position">1</xsl:with-param>
</xsl:call-template>
[/code]
Le résultat s'affiche à l'écran, et si je veux le stocker ?
Aussi incroyable que ça puisse paraître, tout simplement :
[code]
<xsl:variable name="tot_ratio">
<xsl:call-template name="somme_ratios">
<xsl:with-param name="total">0</xsl:with-param>
<xsl:with-param name="position">1</xsl:with-param>
</xsl:call-template>
</xsl:variable>
[/code]
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 :
[code]
<p class="photo">
<!-- ... -->
</p>
[/code]
Nous sommes toujours sur le noeud "parapraphe", et nous allons afficher chaque image :
[code]
<xsl:for-each select="image">
<!-- ... -->
</xsl:for-each>
[/code]
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) :
[code]
<xsl:variable name="l_new">
<xsl:value-of select="number(@l_orig * $larg_page div @h_orig div $tot_ratio)" />
</xsl:variable>
<xsl:variable name="h_new">
<xsl:value-of select="number($l_new * @h_orig div @l_orig)" />
</xsl:variable>
[/code]
Et affichons cette image, suivie d'un espace pour les séparer "proprement" :
[code]
<img alt="Image introuvable...">
<xsl:attribute name="src"><xsl:value-of select="." /></xsl:attribute>
<xsl:attribute name="width">
<xsl:value-of select="$l_new" />
</xsl:attribute>
<xsl:attribute name="height">
<xsl:value-of select="$h_new" />
</xsl:attribute>
</img>
<xsl:text> </xsl:text>
[/code]
Bon ben c'est fini ?
Reste plus qu'à tout recomposer (mettez tout dans le même répertoire) :
exemple.dtd
[code]
<?xml version="1.0" encoding="iso-8859-1"?>
<!ELEMENT site (parametres,page+)>
<!ELEMENT page (paragraphe+)>
<!ELEMENT paragraphe (image+)>
<!ELEMENT image (#PCDATA)>
<!ATTLIST image l_orig NMTOKEN #REQUIRED h_orig NMTOKEN #REQUIRED>
[/code]
exemple.xml :
[code]
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<!--?xml version="1.0" encoding="iso-8859-1" standalone="no"?-->
<?xml-stylesheet type="text/xsl" href="exemple.xsl"?>
<!DOCTYPE librairie SYSTEM "exemple.dtd">
<site>
<page>
<paragraphe>
<image l_orig="400" h_orig="398">exemple3.jpg</image>
<image l_orig="700" h_orig="511">exemple4.jpg</image>
<image l_orig="300" h_orig="426">exemple5.jpg</image>
</paragraphe>
<paragraphe>
<image l_orig="400" h_orig="404">exemple1.jpg</image>
<image l_orig="200" h_orig="226">exemple1.jpg</image>
<image l_orig="100" h_orig="324">exemple1.jpg</image>
</paragraphe>
<paragraphe>
<image l_orig="600" h_orig="180">exemple2.jpg</image>
<image l_orig="600" h_orig="320">exemple2.jpg</image>
</paragraphe>
</page>
</site>
[/code]
exemple.xsl :
[code]
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="larg_page">900</xsl:variable>
<xsl:template match="/">
<html>
<head>
<!-- La partie en-tête -->
</head>
<body class="defaut">
<xsl:variable name="tot_ratio">
<xsl:call-template name="somme_ratios">
<xsl:with-param name="total">0</xsl:with-param>
<xsl:with-param name="position">1</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="l_new">
<xsl:value-of select="number(@l_orig * $larg_page div @h_orig div $tot_ratio)" />
</xsl:variable>
<xsl:variable name="h_new">
<xsl:value-of select="number($l_new * @h_orig div @l_orig)" />
</xsl:variable>
<p class="photo">
<xsl:for-each select="image">
<img alt="Image introuvable...">
<xsl:attribute name="src"><xsl:value-of select="." /></xsl:attribute>
<xsl:attribute name="width">
<xsl:value-of select="$l_new" />
</xsl:attribute>
<xsl:attribute name="height">
<xsl:value-of select="$h_new" />
</xsl:attribute>
</img>
<xsl:text> </xsl:text>
</xsl:for-each>
</p>
</body>
</html>
</xsl:template>
<xsl:template name="somme_ratios">
<xsl:param name="total"/>
<xsl:param name="position"/>
<!--Dans quel cas somme-nous ? -->
<xsl:choose>
<!-- 1: oui, il existe une image -->
<xsl:when test="$position <= count(image)">
<!-- définition des deux variables
largeur et hauteur (lecture d'attributs) -->
<xsl:variable name="largeur_i">
<xsl:value-of select="image[position()=$position]/@l_orig"/>
</xsl:variable>
<xsl:variable name="hauteur_i">
<xsl:value-of select="image[position()=$position]/@h_orig"/>
</xsl:variable>
<!-- calcul du ratio l/h de cette image -->
<xsl:variable name="ratio_i">
<xsl:value-of select="number($largeuri div $hauteuri)"/>
</xsl:variable>
<!-- puis on passe à l'image suivante, en mettant à jour les paramètres
<xsl:call-template name="somme_ratios">
<xsl:with-param name="total">
<xsl:value-of select="$total+$ratio_i"/>
</xsl:with-param>
<xsl:with-param name="position">
<xsl:value-of select="$position+1"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<!-- 2:Sinon, cas final, plus d'image, on "affiche" le résultat -->
<xsl:otherwise>
<xsl:value-of select="$total"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
[/code]
|
|
dimanche 19 juin 2005 à 11:08:36 |
Re : [XML XLMS] Somme d'un produit

bubuze
|
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
|
|
Cette discussion est classée dans : images, code, xml, somme, largeur
Répondre à ce message
Sujets en rapport avec ce message
[XML/DTD/XSL/CSS/HTM] Exemple affichage d'images (tutorial) [ par bubuze ]
[XML/DTD/XSL/CSS/HTM] Exemple affichage d'images (tutorial) Bonjour ! j'avance pas à pas en xml/xsl -> html, dans le but de créer des galeries de p
menu xp modification [ par NKWolf ]
bonjour tout le monde je suis un grand débutant et j'ai trouver le menu xp ici : http://www.javascriptfr.com/code.aspx?ID=16053 et mon problème est
Ilot de données XML [ par JoebarGlut ]
Bonjour,Je me confronte au problème d'ilots de données sous firefox.J'ai donc suivi le tutoriel ici : http://www.aliasdmc.fr/coursjavas/cours_javascri
Code source d' images clignotants alternativement [ par TMZW ]
Bonjour, Je suis à la recherche d'un code source (javascript) qui puisse me permettre d'afficher sur un page HTML, deux images s'alternant dans un m
largeur du <select> [ par redpooka ]
Comment définir la largeur d'un ?Pour ne pas avoir par exemple qu'un caractère dans le champ mais avoir des espaces apres ?<se
Lire fichier XML [ par indiana_jules ]
Bonjour,voilà, j'ai une petite question. Je sais qu'on peut en javascript lire dex fichiers XML, notamment en utilisant :var xmldoc = new ActiveXObjec
Je recherche un code spécifique pour des fichiers images [ par chouk57 ]
Bonjour,En pleine refonte de mon portfolio, je cherche un code permettant, lors d'un rollover sur une image, de voir cette image en question en plus g
XML et interprétation IE/FF [ par yyoupla ]
Hello à tous, j'ai un petit souci d'interprétation de code XML en Javascript. Voici la structure basique de mon xml : <categor
evenement OnMouseOver sur des images [ par zatox ]
bonjour à tous, pour donner un peu plus de vie a mon site, j'aimerai utiliser l'evenement OnmouseOver sur certaines des images pour en changer la coul
Images avec zoom [ par blackoo ]
Salut ! Je voulais savoir si quelqu'un connaissait le code pour avoir des images avec zoom / dézoom comme sur ce site www.livewii.fr (ouvrez une news
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|