Bonjour,

Grande débutante des technologies XML, je n'ai pourtant pas froid aux yeux pour directement essayer de créer un formulaire tenant la route avec XForms.

Mon document XML définit 7 Montants sans attribut ni valeur.
Mon document XSLT affiche un tableau avec ces 7 lignes grâce à un <xsl:for-each>
Ce tableau afficher sur chaque ligne un <input> simple XForm.

Mon problème : Je souhaiterais afficher en fin de tableau la somme des chiffres qui seront inscrits dans ces cases.
J'ai trouvé mention d'addition dans le livre XSLT en action (O'reilly) qui me donne deux pages de code que je ne comprends absolument pas, suivi du commentaire suivant :
a écrit :
L'utilisation de la fonction sum() intégrée à XPath est le moyen le plus simple d'effectuer des sommes simples. Cependant, si vous voulez faire la somme des différentes fonctions sur les noeuds d'un ensemble, vous devez soit :
- Utiliser l'une des recettes de cette section ;
- Calculer d'abord la fonction sur les noeuds, réccupérer le résultat dans une variable sous la forme d'un fragment d'arbre résultat, puis utiliser une fonction d'extension pour convertir ce fragment en un ensemble pouvant être passé à sum(). Avec XSLT2.0, les sommes généralisées deviendront triviales par suite de l'abandon des fragments d'arbres résultats.


Comme j'ai l'impression d'être dans un cas de figure "simple" (corrigez-moi si je me trompe... de toute manière j'ai rien compris à la solution "pas simple"), j'ouvre mon autre bouquin "XML en concentré", chapitre XPath à la recherche de sum() :
a écrit :
Signature
number sum(node-set nodes)

Description
La fonction sum() convertir chaque noeud de son argument en nombre, comme par un appel à la fonction number(), ajoute ces nombres et retourne le résultat.


Vu que j'ai toujours rien compris, et que je ne sais même pas comment utiliser sum(), je continue à fureter sur wikibooks et lance une recherche sur le terme... et voilà que je tombe sur XQuery qui me renvoie sur un exemple XForm que j'avais déjà rencontré.

Que dois-je faire ? J'avoue, je suis complètement larguée...
Je ne cherche pas forcément une solution toute faite, j'aime bien comprendre comment ça marche (ça permet de ré-utiliser ensuite). N'oubliez pas que je suis une débutante (cf: je n'ai rien compris au code ni au blabla de mon bouquin XSLT ni aux morceaux de Wikibooks abordant les additions).

Je vous mets ici les misérables morceaux de mes différents codes.

1- Le morceau de document XML
<?xml version="1.0" encoding="ISO-8859-15" standalone="yes"?>
<?xml-stylesheet type="application/xml" href="ecran.xslt"?>
<Remboursement>
[...]
 <DétailMontants monnaie="€">
  <Montant />
  <Montant />
  <Montant />
  <Montant />
  <Montant />
  <Montant />
  <Montant />
<!-- oui, pas beau, je sais, j'ai pas compris comment répéter un truc N fois dans XSLT non plus -->
[...]
 </DétailMontants>
[...]
</Remboursement>


2- Le XSLT :

<table>
 <tr>
  <td>Objet</td>
  <td>Montant</td>
 </tr>
 <xsl:for-each select="Remboursement/DétailMontants/Montant">
 <tr>
  <td><xf:input><xf:label></xf:label></xf:input></td>
  <td><xf:input><xf:label></xf:label></xf:input></td>
 </tr>
 </xsl:for-each>
 <tr>
  <td>Total</td>
  <td></td>
 </tr>
</table>


Merci énormément par avance,

MeLu-qui-comprend-rien-à-rien
Modifié par MeLu (18 Sep 2007 - 12:07)
Je m'étais également intéressé aux Xforms, j'ai vite été refroidi, voir ce post que j'avais fait :

lien ici

Du coup j'avais pas trop chercher plus loin.
Bon courage si tu persistes.
Modifié par Bellami (19 Sep 2007 - 13:27)
Etant assez têtue, j'avoue ne pas du tout aimer ne pas comprendre... d'habitude j'arrive à peu près à m'en sortir en farfouillant à droite à gauche, mais sur ce sujet je ne trouve pas d'aide à ce niveau-là Smiley decu

Quelqu'un d'autre aurait un début de piste ?

Merci encore
Modérateur
Salut, Smiley smile

Si j'ai bien compris, ce que tu veux, c'est obtenir la somme des montants entrés par l'utilisateur, non ?

Si c'est le cas, il faut obligatoirement transmettre ces données au serveur avant qu'elles puissent être traitées.

De là, tu as plusieurs choix :

- soit tu récupères chaque montant via PHP, tu fais la somme via ce langage puis tu transmets le résultat en tant que paramètre lors de la transformation xsl.

- soit tu envoies chaque montant en tant que paramètre et, au sein de la feuille xslt, tu fais le calcul via :
<xsl:value-of select="$montant1 + $montant2 + ..."/>

Ce qu'il faut, c'est que la transformation se fasse côté serveur (ce qui ne semble pas être le cas) car la transformation effectuée via le navigateur n'est pas fiable.
Hmmm... je ne souhaite pas envoyer les données au serveur, le formulaire étant simplement destiné à être rempli par l'utilisateur puis imprimé.

Il s'agit d'un formulaire de remboursement de frais dans une association. L'employé se connecte sur la page, remplit le formulaire (la somme se fait automatiquement), l'imprime et le remet au responsable avec les justificatifs correspondants (facture, ticket de caisse, billet de train, etc).

Le deuxième souci, c'est que question serveur, je n'ai jamais effleuré la question... eheheh

En tous cas, je vais d'abord tenter la transformation via le navigateur.

Merci pour cette solution, qui m'a l'air si simple que je me sens ultra-bête de ne pas y avoir songé Smiley bawling
Modérateur
Malgré que le formulaire soit destiné à l'impression, cette solution, effectuée côté serveur, resterait la meilleure car c'est la seule qui puisse être pleinement accessible. Smiley cligne

Si tu fais l'impasse, alors tu peux le faire via Javascript.

Il te faut une fonction qui prend les choses en main à la soumission du formulaire. De là, c'est le même principe :

- soit tu récupères chaque montant via Javascript, tu fais la somme via ce langage puis tu transmets le résultat en tant que paramètre lors de la transformation xsl (effectuée avec JS cette fois-ci).

- soit tu envoies chaque montant en tant que paramètre et, au sein de la feuille xslt et tu fais le calcul comme dans mon précédent post.

Dans tous les cas, la transformation faîte par le navigateur n'est pas une bonne chose.
Modérateur
Une petite précision :

Si tu veux que le calcul se fasse automatiquement lors du remplissage du formulaire, tu peux le faire via JS (ou Ajax si tu veux réemployer des bouts de code php) mais dans tous les cas, la transformation via php devrait être là. Une fois que tu as effectué cette transformation, rien ne t'empêche d'ajouter un print (JS) de manière à ce que quand l'utilisateur clique sur le bouton de validation, il est déjà le résultat visible et la fenêtre d'impression qui se lance automatiquement.
JavaScript, j'ai déjà fait (dans la version formulaire html simple), et je trouve ça très fouilli, pas très propre.

Dans le cas où je souhaiterais passer par une solution serveur... comment ça marche ?
Modérateur
MeLu a écrit :
JavaScript, j'ai déjà fait (dans la version formulaire html simple), et je trouve ça très fouilli, pas très propre.
Javascript est un langage propre; tout dépend de la manière dont tu t'en sers. Smiley cligne A partir du moment où ton application repose obligatoirement dessus, c'est là que ça devient "sale".

a écrit :
Dans le cas où je souhaiterais passer par une solution serveur... comment ça marche ?
Tu peux faire un truc du style :
<?php

header('Content-type: text/html; charset=utf-8');

$tab = array(
	'xml' => 'index.xml',
	'xsl' => 'index.xsl'
);

if(!empty($_POST['montant']))
	$tab['montant'] = $_POST['montant'];

if(is_array($tab))
	if(!empty($tab['xml']) && !empty($tab['xsl']))
	{
		$DomXml = DOMDocument::load($tab['xml'])
		or die('Vérifie l\'url ou la validité du fichier xml que tu envoies !');
		$DomXsl = DOMDocument::load($tab['xsl'])
		or die('Vérifie l\'url ou la validité du fichier xsl que tu envoies !');

		$process = new XSLTProcessor;
		$process->importStyleSheet($DomXsl);
		foreach($tab as $param => $value)
			if($param === 'xml' || $param === 'xsl')
				continue;
			else
				$process->setParameter("", $param, htmlspecialchars($value));

		print $process->transformToXML($DomXml);
	}

?>
Ce n'est qu'un exemple à adapter... Tu peux mettre autant de paramètres que tu souhaites dans le tableau $tab. Après, toujours suivant cet exemple, tu peux récupérer ton paramètre comme suit :
<?xml version="1.0" encoding="utf-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:output method="xml" version="1.0" encoding="utf-8"
	omit-xml-declaration="yes" indent="yes" media-type="text/html"
	doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

	<xsl:template match="/">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
			<head>
				<meta http-equiv="content-type" content="text/html; charset=utf-8" />
				<title>Titre</title>
			</head>
			<body>
				<xsl:apply-templates/>
			</body>
		</html>
	</xsl:template>

	<xsl:param name="montant"/>

	<xsl:template match="node()">
		<p xmlns="http://www.w3.org/1999/xhtml">
			<xsl:value-of select="$montant"/>
		</p>
	</xsl:template>

</xsl:stylesheet>
En train de lire le code que tu m'as donné (merci merci merci merci merci merci merci)... maintenant je vais essayer de comprendre et de mettre en place (c'est pas gagné).

Je reposte si j'ai des questions ^^