Thanks for the hints. I can finally agree it’s a bug ;) I have added a
GitHub issue for it [1]. The problem only occurs with "database nodes"
(which are the ones created via "fn:doc", "fetch:xml", or by applying
transformations via "copy $c := ..." or "... update {}".

This looks to me like a generall weakness of the EXPath spec in
general: A namespace declaration will always be valid for all
descendant nodes of an element. As it doesn’t make sense to keep the
http namespace when supplying bodies via http:send-request, we are
explicitly removing the namespace from the body node before sending it
out. As there is no such functionality in XQuery like “removing
namespaces”, this operation is not well-defined, and it’s probably the
reason for this bug.

I hope I’ll find time to fix this soon.

Cheers,
Christian

[1] https://github.com/BaseXdb/basex/issues/1353


On Fri, Sep 16, 2016 at 4:06 PM, Christian Grün
<christian.gr...@gmail.com> wrote:
> Hm. I can’t reproduce it..
>
> 1. I stored your module as 'example.xqm' in the WEBPATH directory
> 2. I started basexhttp
> 3. I created an empty 'exampledb' database in the GUI and closed it again
> 4. I ran your script in the GUI (after rewriting fetch:xml(...) with 
> <example/>)
> 5. I ran db:open('exambledb')
>
> Did I do something wrong?
>
> By the way, if possible, remove everything from your examples that
> required manual post-processing. Could you please check the following
> code and tell me how the returned XML looks like?
>
> _ example.xqm ___________
>
>   module namespace example = 'http://localhost/example';
>   declare
>     %rest:path("/example")
>     %rest:POST("{$body}")
>   function example:post($body) {
>     $body
>   };
>
> _ test.xqm ___________
>
>   http:send-request(
>     <http:request href="http://localhost:8984/example"; method='POST'>
>       <http:body media-type='text/xml'>
>         <example/>
>       </http:body>
>     </http:request>
>   )[2]
>
> On my system, I get "<example/>".
>
>
>
> On Thu, Sep 15, 2016 at 2:34 PM, chrisis <chrisisa...@gmail.com> wrote:
>> Hi Christian
>>
>> Sorry, chopped that out of the real thing in a bit of a hurry and made a bit
>> of a mess of it.
>> Here's something slightly closer to a SSCE.
>>
>>
>> Module under WEBPATH
>>
>> xquery version "3.1" encoding "utf-8";
>> module namespace example = 'http://localhost/example';
>> declare
>> %rest:path("/example/post/{$fname}")
>> %rest:POST("{$body}")
>> %updating
>> function example:post($fname, $body as document-node())
>> {db:replace('exampledb', '/post/'||$fname, $body) };
>>
>>
>> Script run in BaseX GUI
>>
>> let $file := 'C:\temp\xq\example.xml'
>> let $fname := 'example.xml'
>> let $targetrestxqproc := 'http://localhost:8984/example/post/'
>> let $body := fetch:xml($file, map { 'chop': true() })
>> return http:send-request(<http:request href="{$targetrestxqproc||$fname}"
>> method='POST'>
>>     <http:body media-type='text/xml'>{$body}</http:body>
>>     </http:request>)
>>
>> Result in exampledb is
>> <example xmlns:http="http://expath.org/ns/http-client"/>

Reply via email to