gueye weuz wrote:
J'ai une collection de documents sur exist. A chaque
document est associé un identifiant (mon attribut)
généré automatiquent par exist. Je veux à partir du
nom du document (récupéré depuis un formulaire)
retrouvé dans ma base l'identidiant qui lui est
associé.
 Pour cela j'ai procédé comme suit:
1. Récupérer le nom du document dans le flowscript
 var paramNomDoc = form.getChild("nomDoc").getValue();

2. Ensuite je fais une requete xquery ds ma base:
cocoon.sendPageAndWait("getUserId.xq",{nom: paramNomDoc});

le pipeline:
<map:match pattern="getDocId.xq">
<map:generate type="xquery" src="xquery/getDocId.xq" >
<map:parameter name="nom" value="{flow-attr:nom}" />
</map:generate>
<map:serialize type="xml"/> </map:match>

fichier xq:

xquery version "1.0" encoding "ISO-8859-1";

<identifiants>
{
for $doc in collection("/societe/document")/document
where $doc/nom = $nom return
                        <identifiant>
                                {$doc/@id}                              
                        </identifiant>
}
</identifiants>


3. J'affiche la valeur de l'id par:
print(cocoon.request.getAttribute("id"));

??? Il n'y a rien dans le code précédent qui met une valeur dans cet attribut !

Je crains aussi que l'exécution de mon flowscript soit
arrétée apres le sendPageAndWait càd qu'il m'affiche
sur le navigateur le fichier xml.

Effectivement. cocoon.sendPageAndWait envoie le résultat du pipeline au navigateur et suspend le flowscript.

Est ce que cette démarche est bonne?

Pas du tout :-)

Ta XQuery est ce que je qualifie de "pipeline applicatif" : c'est de la logique métier implémentée sous la forme d'un pipeline parce que les sources de données et/ou la nature du traitement s'y prêtent bien. Un point important est que ce type de pipeline ne constitue *pas* la réponse à l'utilisateur, et ne doit donc pas être utilisé dans un cocoon.sendPage ou un cocoon.sendPageAndWait.

La classe PipelineUtil est précisément là pour faciliter l'utilisation de ces "pipelines applicatifs", en permettant d'appeler un pipeline avec des paramètre, et en récupérant sont résultat sous différentes formes (stream, SAX et DOM).

Voici qq chose qui devrait mieux marcher :

var pipeUtil = cocoon.createObject(org.apache.cocoon.components.flow.util.PipelineUtil);
 var doc = pipeUtil.processToDOM("getUserId.xq",{nom: paramNomDoc});
 var list = doc.documentElement.childNodes;
 for (var i = 0; i < list.length(); i++) {
     var child = list.item(i);
     print(child.firstChild.nodeValue);
 }

Sylvain

--
Sylvain Wallez                        Anyware Technologies
http://bluxte.net                     http://www.anyware-tech.com
Apache Software Foundation Member     Research & Technology Director


---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:[EMAIL PROTECTED]
Autres commandes : mailto:[EMAIL PROTECTED]

Reply via email to