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
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
Many thanks for explaining, Christian - that makes sense. Thank you also for 10.6!
All the best, Andrew
On Wed, 10 May 2023 at 21:34, Christian Grün christian.gruen@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
basex-talk@mailman.uni-konstanz.de