In the recent past more than one XQuery user has asked me the same question: why is XQuery escaping my angle brackets? One of the examples of such problem looked something like this:[cc lang="xquery"]let $input :=
book 1 book 2
for $book in $input/book
return
(string(""),
$book/text(),
string(""))[/cc]
...and the result is:[cc lang="xquery"]
< book_123 >book 1</ book_123 >
< book_456 >book 2</ book_456 >
[/cc]
Indeed XQuery is escaping (converting the character into entities) those angle brackets; but rightfully so! What the user is trying to do is to output XML elements whose name and value are dynamically computed; but what that XQuery is doing is to output *text*, not elements; that's why escaping is taking place.
What the user is really trying to do is what XQuery supports through computed constructors; computed constructors allow to create elements "dynamically", without any need to worry about angle brackets, escaping or anything like that.
Changing the XQuery to use computed constructors is easy:[cc lang="xquery"]
let $input :=
book 1 book 2
for $book in $input/book
return
element {concat("book_", $book/@isbn)} {$book/text()}
[/cc]This time the result of the XQuery is what the user is looking for:[cc lang="xquery"]
book 1
book 2
[/cc]
This is just something to remember if you ever hit a similar scenario; as it often happens, if the XQuery you are writing to process or create XML looks too cumbersome, most likely it is!
View all posts from Minollo on the Progress blog. Connect with us about all things application development and deployment, data integration and digital business.
Let our experts teach you how to use Sitefinity's best-in-class features to deliver compelling digital experiences.
Learn MoreSubscribe to get all the news, info and tutorials you need to build better business apps and sites