xquery:eval() - handling of &
Wednesday, 10 May 2023 · 3 messages · last reply 11 May 2023
AS
Andrew Sales10 May 2023 14:30 #
Hello,
The query
xquery:eval(
'contains(.,"&")',
map{'':<foo><&></foo>}
)results in:
[XPST0003] Invalid entity: '&")...'.
I can get the expected result if I double-escape the entity:
'contains(.,"&amp;")'
or wrap in a call to serialize:
serialize('contains(.,"&")')
However, both
xquery:eval(
'contains(.,"<")',
map{'':<foo><&></foo>}
)and
xquery:eval(
'contains(.,">")',
map{'':<foo><&></foo>}
)return true, as expected.
Is this a bug, or am I missing something?
Thanks,
Andrew
CG
Christian Grün10 May 2023 22:34 #
Hi Andrew,
Quoted text · Andrew Sales · 3 lines
> 'contains(.,">")', > … > return true, as expected.
The difference is that < and > don’t have to be encoded if they are used in strings. You can write…
contains('', '<')
…but the following query is invalid:
contains('<', '&')
Quoted text · Andrew Sales · 2 lines
> I can get the expected result if I double-escape the entity: > 'contains(.,"&amp;")'
You can use the string constructor syntax, it’s often better readable:
xquery:eval(
``[contains(., "&")]``,
map { '': <foo>{ ``[&<]`` }</foo> }
)With recent versions of BaseX, you can also use simple backticks (that’s XQuery 4 syntax, it will be documented soon). The following queries are equivalent:
&
``[&]``
"&"
Hope this helps,
ChristianAS
Andrew Sales11 May 2023 11:05 #
Many thanks for explaining, Christian - that makes sense.
Thank you also for 10.6!
All the best,
Andrew
Quoted text · Christian Grün · 38 lines
On Wed, 10 May 2023 at 21:34, Christian Grün <christian.gruen at gmail.com> wrote: > Hi Andrew, > > > 'contains(.,">")', > > … > > return true, as expected. > > The difference is that < and > don’t have to be encoded if they are > used in strings. You can write… > > contains('', '<') > > …but the following query is invalid: > > contains('<', '&') > > > I can get the expected result if I double-escape the entity: > > 'contains(.,"&amp;")' > > You can use the string constructor syntax, it’s often better readable: > > xquery:eval( > ``[contains(., "&")]``, > map { '': <foo>{ ``[&<]`` }</foo> } > ) > > With recent versions of BaseX, you can also use simple backticks > (that’s XQuery 4 syntax, it will be documented soon). The following > queries are equivalent: > > `&` > ``[&]`` > "&" > > Hope this helps, > Christian >
Written for BaseX 10.6. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery