3

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?

Joe Wicentowski
  • 5,159
  • 16
  • 26
V.S.
  • 55
  • 6

2 Answers2

4

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.

wst
  • 11,681
  • 1
  • 24
  • 39
3

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,
...
dirkk
  • 6,160
  • 5
  • 33
  • 51
Leo Wörteler
  • 4,191
  • 13
  • 10