V.S.
V.S.

Reputation: 55

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

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?

Upvotes: 3

Views: 259

Answers (2)

Leo Wörteler
Leo Wörteler

Reputation: 4241

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,
...

Upvotes: 3

wst
wst

Reputation: 11771

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.

Upvotes: 4

Related Questions