Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XQuery in BaseX - let statement outside of file:write()

Tags:

xquery

basex

I have the following code:

let $fName := "C:\Users\user\Documents\Sitemaps\Updated Pages\Books.xml"

file:write($fName,
  element titles{
    for $x in doc("http://www.w3schools.com/xsl/books.xml")/bookstore/book
    where $x/price>0
    order by $x/title
    return $x/title
})

BaseX is giving me an error - "Incomplete FLWOR expression: expecting 'return'." It is specifically highlighting the file:write line, underlining file in red.

I'm not sure why this is happening. How do I structure this to avoid syntax errors?

like image 271
V.S. Avatar asked Dec 03 '25 22:12

V.S.


2 Answers

You can't have a let without a return. In your case you would simply add the return before file:write:

let $fName := "C:\Users\user\Documents\Sitemaps\Updated Pages\Books.xml"
return file:write($fName,
...

It's easier to reason about XQuery if you consider that everything is an expression. What you would normally be able to execute as a statement in a procedural language, possibly with no dependencies to other statements, in XQuery must be part of a valid expression - generally, FLWOR or XPath.

like image 53
wst Avatar answered Dec 06 '25 07:12

wst


If you want to declare constants at the top of the file, you can use declare variable instead of let (which, as @wst said, must be part of a FLWOR expression):

declare variable $fName := "C:\Users\user\Documents\Sitemaps\Updated Pages\Books.xml";
file:write($fName,
...
like image 22
Leo Wörteler Avatar answered Dec 06 '25 07:12

Leo Wörteler



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!