[xquery-talk] making a search case-insensitive

Michael Kay mhk at mhk.me.uk
Thu Jul 27 10:55:21 PDT 2006


The correct way to do this is to search using a caseblind collation, but
I've no idea whether that's a feature that your product supports. 

$keyword and upper-case($keyword) are both strings; you can't apply the "or"
operator to two strings, it works only with boolean operands. So "$keyword
or upper-case($keyword)" will give you a type error.

Similarly, te contains() function tests whether one string is a substring of
another. I suspect when you write contains($text, $kwds) you are imagining
that $kwds is a set of strings and that the function will return true if
$text contains any of them.

So:

(a) to make $kwds be a set (sequence) of strings, do

$kwds := ($keyword, upper-case($keyword), lower-case($keyword), $mixedkwd)

(b) to test if $text contains any of them, do

some $k in $kwds satisfies contains($text, $k)

But wouldn't it be easier simply to test

contains(upper-case($text), upper-case($keyword))

?

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: talk-bounces at xquery.com 
> [mailto:talk-bounces at xquery.com] On Behalf Of Cindy Girard
> Sent: 27 July 2006 02:18
> To: talk at xquery.com
> Subject: [xquery-talk] making a search case-insensitive
> 
> Hi,
> 
>   I'm using Berkely XMLDB as my search database for one of my
>   projects, and I can't seem to find anything that allows me to
>   specify if I want the search case-sensitive or not. And it's
>   case-sensitive by default.
> 
>   Well, I need it to be case-insensitive, so I'm trying to do it in
>   the xquery instead.
> 
>   I have the following snippet:
> 
>  let $mixedkwd := (concat (upper-case(substring($keyword, 1, 
> 1)), lower-case(substring($keyword, 2)))),
>      $kwds := ($keyword or upper-case($keyword) or 
> lower-case($keyword) or $mixedkwd),
> 
>      $hits :=
>            for $entries in collection($collctn)//tei.2
>                                          let $docname := 
> concat($entries/@id, '.xml')
>                                          let $text := $entries/text
>                                          where contains($text, $kwds)
>      
> 
>                                          
> 
>    I'm getting an ItemType matching failed error. Can someone correct
>    my syntax, or is there a better way to do this?
> 
>    Thanks,
>   
> -----
> - Cindy  
> 
> Cynthia M. Girard
> IATH, University of Virginia
> clm6u at virginia.edu
> 
> "Danger? I laugh in the face of danger!
> ...and then I hide until it goes away."
> 
> _______________________________________________
> talk at xquery.com
> http://xquery.com/mailman/listinfo/talk



More information about the talk mailing list