I\'m currently making a xpath search, I\'ve got the the search working but I need to make it case insensitive. The xml file I\'m using is 1.0 which from my research means I\
XPath 1.0 :
$qry = "//channel/item[contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
translate($search, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]"
XPath 2.0 :
$qry = "//channel/item[lower-case(.) = lower-case($search)]"
Both replace all upper case to lower case.
Technically, to do a case-blind comparison you should use a case-blind collation, unless your text happens to be English; normalizing both operands to upper case or to lower case does not give the correct result in all circumstances. Unfortunately collation names (in XPath 2.0) aren't standardised so you have to look in your product documentation to see what collations are available.
A case insensitive search can be using using the matches
function like so
$qry = "//string[text() [matches(.,'^stringImTryingToFind$','i')]]"
the //string[text() [matches(.,'^OK$','i')]]
section of the query uses regular expressions (REGEX) to determine a match.
The currently accepted answer is flawed -- because nothing guarantees that the second argument of contains()
is already converted to lower case.
Also, it uses '$search'
-- and this is literally the string "$search"
-- not the variable $search
.
Here is a correct solution:
//channel/item
[contains(translate(.,
'ABCDEFGHJIKLMNOPQRSTUVWXYZ',
'abcdefghjiklmnopqrstuvwxyz'),
translate($txtSearch,
'ABCDEFGHJIKLMNOPQRSTUVWXYZ',
'abcdefghjiklmnopqrstuvwxyz')
)
]
The corresponding XPath 2.0 expression:
//channel/item[contains(lower-case(.), lower-case($txtSearch))]
Update:
Based on this solution, @alain.janinm
has corrected his answer.