analyze-string

Thursday, 23 April 2020 · 2 messages
MH
Martin Honnenin reply to Graydon Saunders, 23 Apr 2020, 17:4023 Apr 2020 16:11 #
Quoted text · Graydon Saunders · 39 lines
On 23.04.2020 15:40, Graydon Saunders wrote: > So if I create a query in the BaseX 9.3.2 GUI, thus: > > declare function local:processMatch($in as text(),$matchPattern as > xs:string) as item()+ { > let $search as element() := > analyze-string(normalize-space($in),$matchPattern) > return $search > }; > > let $example := <para>These are a bunch of words, and some of the > words are <em>special</em> words.</para> > > for $text in $example//text() > return local:processMatch($text,'bunch|special') > > I get: > <fn:analyze-string-result > xmlns:fn="http://www.w3.org/2005/xpath-functions"> > <fn:non-match>These are a </fn:non-match> > <fn:match>bunch</fn:match> > <fn:non-match> of words, and some of the words *are*</fn:non-match> > </fn:analyze-string-result> > <fn:analyze-string-result > xmlns:fn="http://www.w3.org/2005/xpath-functions"> > <fn:match>special</fn:match> > </fn:analyze-string-result> > <fn:analyze-string-result > xmlns:fn="http://www.w3.org/2005/xpath-functions"> > <fn:non-match>words.</fn:non-match> > </fn:analyze-string-result> > > The trailing space after the *are* in the second fn:non-match element > is gone. > > Should that happen? Can I make it stop happening by invoking the > function differently? > >
Isn't your use of normalize-space in the function causing this? Why do you need that?
GS
Graydon Saunders23 Apr 2020 17:40 #
So if I create a query in the BaseX 9.3.2 GUI, thus:
declare function local:processMatch($in as text(),$matchPattern as
xs:string) as item()+ {
  let $search as element() :=
analyze-string(normalize-space($in),$matchPattern)
  return $search
};

let $example := <para>These are a bunch of words, and some of the words are
<em>special</em> words.</para>

for $text in $example//text()
          return local:processMatch($text,'bunch|special')
I get:
<fn:analyze-string-result xmlns:fn="http://www.w3.org/2005/xpath-functions">
  <fn:non-match>These are a </fn:non-match>
  <fn:match>bunch</fn:match>
  <fn:non-match> of words, and some of the words *are*</fn:non-match>
</fn:analyze-string-result>
<fn:analyze-string-result xmlns:fn="http://www.w3.org/2005/xpath-functions">
  <fn:match>special</fn:match>
</fn:analyze-string-result>
<fn:analyze-string-result xmlns:fn="http://www.w3.org/2005/xpath-functions">
  <fn:non-match>words.</fn:non-match>
</fn:analyze-string-result>
The trailing space after the *are* in the second fn:non-match element is gone. Should that happen? Can I make it stop happening by invoking the function differently? Thanks! Graydon

⚡Generated with XQuery