learn26
learn26

Reputation: 15

Call custom xquery function in eXist-db using url

How to call a custom xquery function in exist-db using the REST API ? Is it possible to have more than 1 function in the xquery file ?

declare function local:toto() as node() {
    return doc("/db/ProjetXML/alice.xml")/raweb/identification/projectName)
};

declare function local:pomme() as node() {
    return doc("/db/ProjetXML/carmen.xml")/raweb/identification/projectSize);
};

If I call it using :

http://localhost:8080/exist/rest/db/ProjetXML/orange.xqy?_query=local:toto()

I get the following error :

err:XPST0017 Call to undeclared function: local:toto [at line 1, column 1, source: local:toto()]

Your help is appreciated.

Upvotes: 1

Views: 347

Answers (1)

adamretter
adamretter

Reputation: 3517

You have syntax errors in your XQuery:

  1. You have two functions named local:toto(). Each function must have a distinct name.
  2. There is no semicolon following the function definition, i.e. } should be };.
  3. Also you should remove the return expression, as there is no preceding binding.

Another option would be to parameterize the input file, e.g.:

import module namespace request="http://exist-db.org/xquery/request";

declare function local:toto($name as xs:string) as node() {
  let $doc :=
      if($name eq "carmen")then
        doc("/db/ProjetXML/carmen.xml")
      else
        doc("/db/ProjetXML/alice.xml")
  return
    $doc/raweb/identification/projectName);
};

local:toto(request:get-parameter("name", "alice"))

You can then call this via the REST Server using a URL like:

  http://localhost:8080/exist/rest/db/ProjetXML/orange.xqy?name=carmen

Upvotes: 2

Related Questions