Hi Everyone,
I'm migrating a webapp from BaseX 9.7 to BaseX 11 and I'm having a problem with a wrapper function (just a function for adding content to an xml template file)
Basically, this function looks for nodes in a template.xml file that matche regex to update the content of this file. Here is a small example :
template.xml <foo> <bar>{content}</bar> </foo>
Query: let $file := 'template.xml' let $wrap := fn:doc($file) let $regex := '{(.+?)}’ (: looking for something between curly braces :)
return for $node in $data//* where $node[fn:matches(text(), $regex)] return $node
This function worked with BaseX 9.7, but returns an error with BaseX 11 : [XPTY0004] Item expected, sequence found: ("
 ", "
").
However, if I put the content of template.xml in a variable, it works (even with BaseX 11): let $wrap := <foo> <bar>{{content}}</bar> (: just escaped curly braces :) </foo> let $regex := '{(.+?)}'
return for $node in $wrap//* where $node[fn:matches(text(), $regex)] return $node (:<bar>{content}</bar>:)
Do you have any idea of what I'm doing wrong or what I’m missing?
Thanks for your help! Best, Josselin
Hi Josselin, you get an error because there are elements containing several text nodes, while the matches() function expects a single item. An element can contain several text nodes for various reasons, as for example mixed content, which is text with elements interspersed. In your case the input XML is "indented", which means it contains whitespace producing the pretty print effect. This whitespace is contained by text nodes, just like real data. In your example, <foo> contains <bar> as well as two whitespace-only text nodes. The error occurs only now because BaseX 9 by default stripped the pretty print text nodes, whereas now they are preserved. You can avoid the problem very simply by changing the "where" expression, so that it checks one text node at a time, like so:where $node[text()[fn:matches(., $regex)]]Any $node will pass which contains at least one text node matching the regular expression.Cheers, Hans-Jürgen Am Freitag, 19. Juli 2024 um 16:49:23 MESZ hat Josselin Morvan morvan.josselin@gmail.com Folgendes geschrieben:
Hi Everyone, I'm migrating a webapp from BaseX 9.7 to BaseX 11 and I'm having a problem with a wrapper function (just a function for adding content to an xml template file) Basically, this function looks for nodes in a template.xml file that matche regex to update the content of this file. Here is a small example : template.xml<foo> <bar>{content}</bar> </foo> Query:let $file := 'template.xml' let $wrap := fn:doc($file) let $regex := '{(.+?)}’ (: looking for something between curly braces :)
return for $node in $data//* where $node[fn:matches(text(), $regex)] return $node This function worked with BaseX 9.7, but returns an error with BaseX 11 : [XPTY0004] Item expected, sequence found: ("
 ", "
"). However, if I put the content of template.xml in a variable, it works (even with BaseX 11):let $wrap := <foo> <bar>{{content}}</bar> (: just escaped curly braces :) </foo> let $regex := '{(.+?)}'
return for $node in $wrap//* where $node[fn:matches(text(), $regex)] return $node(:<bar>{content}</bar>:) Do you have any idea of what I'm doing wrong or what I’m missing? Thanks for your help!Best, Josselin
Hi Hans-Juergen, I missed that point! It works perfectly now. Thanks a lot!! Best, Josselin
Le 19 juil. 2024 à 18:29, Hans-Juergen Rennau hrennau@yahoo.de a écrit :
Hi Josselin,
you get an error because there are elements containing several text nodes, while the matches() function expects a single item. An element can contain several text nodes for various reasons, as for example mixed content, which is text with elements interspersed. In your case the input XML is "indented", which means it contains whitespace producing the pretty print effect. This whitespace is contained by text nodes, just like real data. In your example, <foo> contains <bar> as well as two whitespace-only text nodes.
The error occurs only now because BaseX 9 by default stripped the pretty print text nodes, whereas now they are preserved.
You can avoid the problem very simply by changing the "where" expression, so that it checks one text node at a time, like so: where $node[text()[fn:matches(., $regex)]] Any $node will pass which contains at least one text node matching the regular expression. Cheers, Hans-Jürgen
Am Freitag, 19. Juli 2024 um 16:49:23 MESZ hat Josselin Morvan morvan.josselin@gmail.com Folgendes geschrieben:
Hi Everyone,
I'm migrating a webapp from BaseX 9.7 to BaseX 11 and I'm having a problem with a wrapper function (just a function for adding content to an xml template file)
Basically, this function looks for nodes in a template.xml file that matche regex to update the content of this file. Here is a small example :
template.xml
<foo> <bar>{content}</bar> </foo>
Query: let $file := 'template.xml' let $wrap := fn:doc($file) let $regex := '{(.+?)}’ (: looking for something between curly braces :)
return for $node in $data//* where $node[fn:matches(text(), $regex)] return $node
This function worked with BaseX 9.7, but returns an error with BaseX 11 : [XPTY0004] Item expected, sequence found: ("
 ", "
").
However, if I put the content of template.xml in a variable, it works (even with BaseX 11): let $wrap :=
<foo> <bar>{{content}}</bar> (: just escaped curly braces :) </foo> let $regex := '\{(.+?)\}'
return for $node in $wrap//* where $node[fn:matches(text(), $regex)] return $node (:<bar>{content}</bar>:)
Do you have any idea of what I'm doing wrong or what I’m missing?
Thanks for your help! Best, Josselin
basex-talk@mailman.uni-konstanz.de