How do i make Xpath search case insensitive

后端 未结 4 928
迷失自我
迷失自我 2020-12-11 15:20

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\

相关标签:
4条回答
  • 2020-12-11 16:00

    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.

    0 讨论(0)
  • 2020-12-11 16:05

    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.

    0 讨论(0)
  • 2020-12-11 16:19

    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.

    0 讨论(0)
  • 2020-12-11 16:22

    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.

    0 讨论(0)
提交回复
热议问题