Exemple affichage d'images (tutorial) [XML/DTD/XSL/CSS/HTM] - XML/XSL - Programmation
Marsh Posté le 19-06-2005 à 01:39:37
Une bonne galère c'te problème...
j'ai fini par trouver une solution (unique?) grâce à l'ébauche de la faq
http://www.developpez.net/forums/viewtopic.php?t=90007
Donc merci à grégory !
pour les débutants qui tomberaient ici, je vais essayer d'expliquer la solution en détail,
pour les pros, vos commentaires, conseils et corrections seront gratifiés et gratifiants.
(le code n'est pas optimisé, il est le plus clair possible,
ça fait deux jours que je débute avec ce langage,
et je suis maçon d'origine ;-)
J'en ai fait des tartines bien beurrées, c'est peut-être un peu lourd,
s'il reste des points peu clairs, n'hésitez pas à proposer des corrections.
On y va ?
Rappel de la DTD (simplifiée) :
Code :
|
Exemple de fichier xml :
Code :
|
Contraintes :
Code :
|
Après un bon moment passé sur papier, j'abouti au résultat suivant :
Code :
|
La difficulté vient principalement de ce calcul tot_ratio,
qui ne peut être réalisé simplement avec un :
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 etc...
jusqu'à ce qu'il n'y ait plus d'image (dans le paragraphe).
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 :
|
La fonction doit être capable de lire la largeur et la hauteur de l'image courante :
Rq : on prendra soin d'appeler cette fonction à partir d'un noeud parent de image,
donc à partir de "paragraphe" dans notre cas.
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 :
|
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 :
|
Dans le cas final, on se contente d'afficher le total passé en paramètre
(pour les sceptiques : ça marche !)
Code :
|
exemple de fonctionnement si nous avons 3 images :
Code :
|
Assemblons le tout :
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 :
|
C'est bien sûr dans le corps du html que nous ferons notre appel à la fonction.
Tout d'abord un traitement à réaliser indépendamment, pour chaque paragraphe :
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 :
|
Le résultat s'affiche à l'écran, et si je veux le stocker ?
Aussi incroyable que ça puisse paraître, tout simplement
en encadrant cet appel par une définition de 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 pouvons les mettre dans un paragraphe :
Code :
|
Nous sommes toujours sur le noeud "parapraphe", et nous allons afficher chaque image :
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 :
|
Et affichons cette image, suivie d'un espace pour les séparer "proprement" :
Code :
|
Bon ben c'est fini ?
Reste plus qu'à recomposer...
[mettez tout dans le même répertoire
exemple.xml (page à appeler dans le navigateur)
exemple.dtd (appelé par exemple.xml)
exemple.xsl (appelé par exemple.xml, traité par le navigateur récent)
exemple.css (appelé par le navigateur via exemple.xsl)
]
exemple.dtd
Code :
|
exemple.xml (pensez à mettre les exemplex.jpg dans le même dossier) :
l_orig="400" h_orig="398" sont les dimensions originales de l'image
(un jour je saurais les trouver automatiquement)
un coup d'explorateur de fichier vous informera facilement...
Code :
|
exemple.css (une feuille de style classique)
Code :
|
exemple.xsl :
Code :
|
Marsh Posté le 19-06-2005 à 08:08:44
Joli! Ce serait parfait avec un lien pour voir le résultat obtenu en html...
Marsh Posté le 19-06-2005 à 09:24:13
Merci... y'a encore pas mal de boulot,
pour arriver à quelque chose de complet et présentable.
Le résultat html je ne le connais pas, puisque c'est le client qui l'encode à la volée.
Mais dans ce cas ça se limite à :
<p>
<img src="..." width ="..." height ="..."></img>
<img src="..." width ="..." height ="..."></img>
(...)
<img src="..." width ="..." height ="..."></img>
</p>
Marsh Posté le 18-06-2005 à 18:22:42
[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 photos paramétrées...
[EDIT : je pense que c'est un bon exemple pour avancer en xsl après vous être ingurgité les tutoriels XML/DTD/XSL disponibles sur le net.
Voir solution tutorisée (tutorialisée?) dans le message suivant]
Définition du problème :
pour chaque paragraphe, j'insère un nombre variable d'images :
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) :
Maintenant, si je veux améliorer cet affichage, et faire en sorte que les images aient la même hauteur, et soient toujours affichées 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 :
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 :
Voilà !
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
Message édité par La_Buze le 19-06-2005 à 11:10:42