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]