Hi Christian,
 
thanks for your explanation. So it's not a bug, but a somewhat counter-intuitive ehm.. "spec feature" :-)
I can also confirm that XPaths outside the element are not affected by the default namespace. I think I wrote the opposite previously. So the example
 
for $w in /json/workouts/_/header[uuid='123']
let $outside := $w/title/text()
return
<gpx xmlns="http://www.topografix.com/GPX/1/1" >
<title>{$w/title/text()}</title>
<fromOutside>{$outside}</fromOutside>
</gpx>
 
Would yield something like:
 
<gpx xmlns="http://www.topografix.com/GPX/1/1">
<title/>
<fromOutside>Blablabla</fromOutside>
</gpx>

And also good to hear that the case is already addressed in the future BaseX release!

Cheers

   Jörn

Christian Grün <christian.gruen@gmail.com> hat am 11.01.2025 13:45 CET geschrieben:
 
 
Hi Jörn,
 
The behavior is compliant with the spec: The default namespace of node tests in path expressions is affected by default namespace declarations (xmlns="") appearing on element constructors.
 
You can achieve the expected result by using wildcards or the "Q{uri}local" syntax in the path…
 
  $w/*:title/text()
  $w/Q{}title/text()
 
…or by moving the path outside the element constructor.
 
With XQuery 4 (as indicated by Martin), it will be possible to change the default behavior by introducing the query with a declaration that changes the default behavior:
 
declare fixed default element namespace '';
 
This syntax will be supported in one of the next versions of BaseX.
 
Best, 
Christian
 


Jörn Willhöft <jwi@willhoeft-it.com> schrieb am Do., 9. Jan. 2025, 19:23:
Hi all,
 
I just come across an issue, and I am not sure if I am too stupid to see the mistake, or it is a bug in BaseX.
 
I need to create an XML document from data in BaseX 11.5 inside basexgui. The data in the database does not use any namespaces. The document I am creating must have a default namespace set. Here is a stripped down example of my XQuery:
 
for $w in /json/workouts/_/header[uuid='123'] return
<gpx xmlns="http://www.topografix.com/GPX/1/1" >
  <title>{$w/title/text()}</title>
</gpx>
 
Strangely all XPaths inside and outside the gpx-element will not match anything as long as I have the default namespace on the gpx-element defined. It works if I drop the xmlns attribute or I define the namespace explicitly, like:
 
for $w in /json/workouts/_/header[uuid='123'] return
<g:gpx xmlns:g="http://www.topografix.com/GPX/1/1" >
  <g:title>{$w/title/text()}</g:title>
</g:gpx>
 
Even though this should be semantically equal to the output of the above, the third party app that I import this to does not recognize it as such.
 
This is puzzling me mainly because I do not see, why the namespace I define for the *output* xml should have an impact on the queries that are directed to my database. As a workaround I will probably use a regex to remove the namespace, but that's obviously pretty awkward.
 
Any ideas?
 
Cheers
   Jörn