Salut a tous,
Je voulais vous présenter un beau modèle de problème conceptuel, je suppose(groos sigh!) .
Voici, j'ai créer une classe pour regrouper toutes mes requêtes xquery sur une (et une seule base exist-db , c-a-d xml). Voici comment elle se présente:
Pour info, la requête est bonne; si je l'affiche j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Class xqueryBP { public $db; function __construct() { // création d'une instance EXIST $db2 = new eXist (EXIST_PATH,EXIST_SERVER,EXIST_PORT); $db2->setCredentials (EXIST_USER,EXIST_PASSWORD); $db2->setParamIndent (false); // Pour le debugage $db2->setDebug(DEBUG); $this->db=$db2; } /** * Retourne le fragment tei définit par sa cote et son numéro d'ordre * * @param string $doc cote de la page ou se trouve le fragment * @param int $num_frag N° d'ordre du fragment dans la page * @return string chaine XML contenant le fragment */ public function getFragmentCoteNo($doc, $num_frag) { $_XQUERY1 = 'declare namespace dbp="http://blabla/ns/1.0"; let $doc := doc("'.COLLECTION.'/'.$doc.'") for $fragment in $doc//*:div[@*:type="fragment"]|$doc//*:item[@*:type="fragment"] let $bibl := data($fragment/*:cit/*:bibl) let $lbl_head := $fragment/parent::*/*:head//*:term let $lbl_list := $fragment/parent::*:list/parent::*:item/preceding-sibling::*:label[1]//*:term let $lbl_prec := $fragment/preceding-sibling::*:label[1]//*:term|$fragment/preceding-sibling::*:div[@*:type="label"]//*:term let $quote := data($fragment/*:cit/*:quote) where $fragment[@n="'.$num_frag.'"] return <item> <head>{$lbl_head}</head> <label_list>{$lbl_list}</label_list> <label>{$lbl_prec}</label> <fragment>{$quote}</fragment> <bibl>{$bibl}</bibl> </item>'; $result1 = $this->db->executeQuery($_XQUERY1); return $this->db->retrieve($result1, 0); } }Jusqu'à maintenant, cette classe ne m'avait pas posé de problème, et la méthode définit plus haut fonctionne correctement partout où je l'ai utilisée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 declare namespace dbp="http://blabla/ns/1.0"; let $doc := doc("/db/ma_base/g226_3_f_015__r____-ver3.xml") for $fragment in $doc//*:div[@*:type="fragment"]|$doc//*:item[@*:type="fragment"] let $bibl := data($fragment/*:cit/*:bibl) let $lbl_head := $fragment/parent::*/*:head//*:term let $lbl_list := $fragment/parent::*:list/parent::*:item/preceding-sibling::*:label[1]//*:term let $lbl_prec := $fragment/preceding-sibling::*:label[1]//*:term|$fragment/preceding-sibling::*:div[@*:type="label"]//*:term let $quote := data($fragment/*:cit/*:quote) where $fragment[@n="1"] return <item> <head>{$lbl_head}</head> <label_list>{$lbl_list}</label_list> <label>{$lbl_prec}</label> <fragment>{$quote}</fragment> <bibl>{$bibl}</bibl> </item>
Par contredans la page ci-dessous elle génère une erreur et plante:
En fait, sur cette page la méthode plante et le message retourné par Exist est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 $nb_fragments=$label_en_cours->getNbFragmentsAssociesDansBdd(); $num_fragment=0; $xml=null; $affichage_possible=true; while ($num_fragment < $nb_fragments) { $fragment_en_cours = $label_en_cours->getFragment($num_fragment); // definition de la cote et du numéro de fragment $ref_bib_doc = $fragment_en_cours->fragment->getCote(); $ref_bib_num_frag=$fragment_en_cours->fragment->getNumeroFragment(); $affichage_possible=true; if (($ref_bib_doc=='') || ($ref_bib_num_frag=='')) { $affichage_possible=false; } else { $ref_bib_doc .= '-ver3.xml'; $fragment=''; html::dbg('ref_bib_doc='.$ref_bib_doc.'<br/>ref_bib_num_frag='.$ref_bib_num_frag); $db_xml = new xqueryBP(); $fragment=$db_xml->getFragmentCoteNo($ref_bib_doc, $ref_bib_num_frag); //....affiche le résultat de la méthode ci-dessus, enfin normalement } }Je comprends pas, et cela me bloque---GOT---
HTTP/1.1 200 OK
Date: Wed, 18 Jan 2012 09:53:28 GMT
Server: Jetty/5.1.12 (Linux/2.6.24-30-server amd64 java/1.6.0_18
Content-Length: 363
Content-Type: text/xml
Connection: close
<?xml version="1.0" encoding="UTF-8"?><methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions"><fault><value><struct><member><name>faultCode</name><value><i4>0</i4></value></member><member><name>faultString</name><value>No method matching arguments: java.lang.String, java.lang.String</value></member></struct></value></fault></methodResponse>
---END---
HEADER: HTTP/1.1 200 OK
HEADER: Date: Wed, 18 Jan 2012 09:53:28 GMT
HEADER: Server: Jetty/5.1.12 (Linux/2.6.24-30-server amd64 java/1.6.0_18
HEADER: Content-Length: 363
HEADER: Content-Type: text/xml
HEADER: Connection: close
---EVALING---[170 chars]---
new xmlrpcval(array('faultCode' => new xmlrpcval(0, ''),'faultString' => new xmlrpcval("No method matching arguments: java.lang.String, java.lang.String", '')), 'struct');
---END---![]()
.
Merci pour toute aide.
remarque: j'ai essayé de copier ma méthode directement sur la page php mais cela ne change rien; j'ai essayé de créer un singleton de XQueryBP mais sans de meilleurs résultats.
Partager