Hi all -
I'm accustomed to writing something like the following:
```xquery
declare function local:grab( $url as xs:string, $path as xs:string, $fname as xs:string ) as document-node() { let $req := http:send-request(<http:request method="get"/>, $url) return if (head($req)/@status = "200") then file:write($path || $fname, tail($req), map { "method": "xml" }) else ("something went wrong!") }; ```
but I've noticed that in version 9.4.3 this returns an XPTY error: Stopped at /home/bridger/bin/basex-src/basex-943-xpty0004-error.xq, 1/18: [XPTY0004] Cannot promote xs:string* to document-node(): (let $req_7 := http:send-request(<http:request method="get"/>, " https://dpla.lib.utk.edu/repox/OAIHa....
While this could be a bug, should I be writing this kind of local function differently? Or could I improve my typing on it?
Thanks very much for any advice or insights you can provide. Best, Bridger
Hi Bridger,
As your query will either return an empty sequence (in the case of success) or a string (in the case of an error), you’ll need to use xs:string? as return type:
declare function local:grab( $url as xs:string, $path as xs:string, $fname as xs:string ) as xs:string? { ...
Hope this helps, cheers, Christian
let $req := http:send-request(<http:request method="get"/>, $url) return if (head($req)/@status = "200") then file:write($path || $fname, tail($req), map { "method": "xml" }) else ("something went wrong!") };
but I've noticed that in version 9.4.3 this returns an XPTY error: Stopped at /home/bridger/bin/basex-src/basex-943-xpty0004-error.xq, 1/18: [XPTY0004] Cannot promote xs:string* to document-node(): (let $req_7 := http:send-request(<http:request method="get"/>, "https://dpla.lib.utk.edu/repox/OAIHa.... While this could be a bug, should I be writing this kind of local function differently? Or could I improve my typing on it? Thanks very much for any advice or insights you can provide. Best, Bridger
Christian,
As always, thank you for your help! I had tried the following
```xquery declare function local:grab2( $url as xs:string, $path as xs:string, $fname as xs:string ) as document-node() { let $req := http:send-request(<http:request method="get"/>, $url) return if (head($req)/@status = "200") then file:write($path || $fname, tail($req), map { "method": "xml" }) else document { element error { "something went wrong" } } }; ``` and had the same error - adding an occurrence indicator on the return type solves it for that trial, too.
Much appreciated! Best, Bridger
On Sun, Oct 11, 2020 at 4:06 PM Christian Grün christian.gruen@gmail.com wrote:
Hi Bridger,
As your query will either return an empty sequence (in the case of success) or a string (in the case of an error), you’ll need to use xs:string? as return type:
declare function local:grab( $url as xs:string, $path as xs:string, $fname as xs:string ) as xs:string? { ...
Hope this helps, cheers, Christian
let $req := http:send-request(<http:request method="get"/>, $url) return if (head($req)/@status = "200") then file:write($path || $fname, tail($req), map { "method": "xml" }) else ("something went wrong!") };
but I've noticed that in version 9.4.3 this returns an XPTY error: Stopped at /home/bridger/bin/basex-src/basex-943-xpty0004-error.xq, 1/18: [XPTY0004] Cannot promote xs:string* to document-node(): (let $req_7 :=
http:send-request(<http:request method="get"/>, " https://dpla.lib.utk.edu/repox/OAIHa....
While this could be a bug, should I be writing this kind of local
function differently? Or could I improve my typing on it?
Thanks very much for any advice or insights you can provide. Best, Bridger
And naturally I forgot to mention... On Sun, Oct 11, 2020 at 3:49 PM Bridger Dyson-Smith bdysonsmith@gmail.com wrote:
Hi all -
I'm accustomed to writing something like the following:
declare function local:grab( $url as xs:string, $path as xs:string, $fname as xs:string ) as document-node() { let $req := http:send-request(<http:request method="get"/>, $url) return if (head($req)/@status = "200") then file:write($path || $fname, tail($req), map { "method": "xml" }) else ("something went wrong!") };
but I've noticed that in version 9.4.3 this returns an XPTY error: Stopped at /home/bridger/bin/basex-src/basex-943-xpty0004-error.xq, 1/18: [XPTY0004] Cannot promote xs:string* to document-node(): (let $req_7 := http:send-request(<http:request method="get"/>, " https://dpla.lib.utk.edu/repox/OAIHa....
that despite the error, the correct response is written to the filepath
specified.
While this could be a bug, should I be writing this kind of local function
differently? Or could I improve my typing on it?
Thanks very much for any advice or insights you can provide.
Apologies for the omission!
Best, Bridger
basex-talk@mailman.uni-konstanz.de