Many thanks, Christian! I can confirm that it works also in my environment.
Greetings, Hans-Jürgen
PS: Generic processing requires that namespace bindings do not get lost, as 
they may be required for the interpretation of content. Hence I have to make 
sure that all namespace bindings are preserved. A distinction of namespace 
bindings which would be created anyway - because required by node names - and 
other bindings would be cumbersome. Also, for cosmetic reasons (in order to 
avoid repetitive namespace attributes) the input document may have declared all 
namespace bindings in the root node, and this policy should also be preserved.


    Am Montag, 25. September 2023 um 17:31:39 MESZ hat Christian Grün 
<christian.gr...@gmail.com> Folgendes geschrieben:  
 
 …a bug fix snapshot is available [1]. Once again, I’d recommend you to skip 
the explicit namespace construction if it’s not really needed.[1] 
https://files.basex.org/releases/latest/


On Mon, Sep 25, 2023 at 2:48 PM Christian Grün <christian.gr...@gmail.com> 
wrote:

Thanks, Hans-Jürgen,
looks like a bug; we’ll track that down.
I assume you can simply omit the following line, as the necessary namespace 
declarations will automatically be added (unless you want to enforce the 
adoption of namespace declarations that are not required):
  in-scope-prefixes($n) ! namespace {.} {namespace-uri-for-prefix(., $n)},

Best,Christian

On Wed, Sep 20, 2023 at 6:34 PM Hans-Juergen Rennau <hren...@yahoo.de> wrote:

Dear BaseX folks,
constructing elements, I encounter a problem with namespaces which I do not 
understand. Is it a bug or do I overlook something?
To reproduce the problem you need to create an XML file "doc.xml" with this 
content:
<doc xmlns="http://basex.org/simply/the/best";>    <foo bar="1">         <peng/> 
   </foo></doc>
And here's the query:
declare namespace f="http://basex.org/does/its/thing";;
declare function f:pretty($n as node())        as node()? {    typeswitch($n)   
 case document-node() return document {$n/node() ! f:pretty(.)}    case 
element() return        element {node-name($n)} {            
in-scope-prefixes($n) ! namespace {.} {namespace-uri-for-prefix(., $n)},        
    $n/@* ! f:pretty(.),            $n/node() ! f:pretty(.)        }    default 
return $n};    
let $doc := doc('doc.xml')return f:pretty($doc)
What I get is this error:
Stopped at 
C:/projects/tableman/prototype/thieme-showcase/xq/demo-namespace-problem.xq, 
8/33:[XQDY0102] Duplicate declaration of namespace 
'http://basex.org/simply/the/best'.
Stack Trace:- 
C:/projects/tableman/prototype/thieme-showcase/xq/demo-namespace-problem.xq, 
11/33- 
C:/projects/tableman/prototype/thieme-showcase/xq/demo-namespace-problem.xq, 
11/33- 
C:/projects/tableman/prototype/thieme-showcase/xq/demo-namespace-problem.xq, 
6/63- 
C:/projects/tableman/prototype/thieme-showcase/xq/demo-namespace-problem.xq, 
17/16
Strangely enough, you do not get the error if you copy the contents of doc.xml 
into the query:
let $doc := <doc .../>return f:pretty($doc)
You also do not get the error if you remove the @bar attribute in the document.
Kind regards,Hans-Jürgen

  

Reply via email to