How can I select an element with multiple classes with Xpath?

前端 未结 3 982
甜味超标
甜味超标 2020-12-01 09:27

In the above xml sample I would like to select all the books that belong to class foo and not in class bar by using xpath.



        
相关标签:
3条回答
  • 2020-12-01 09:51

    By padding the @class value with leading and trailing spaces, you can test for the presence of " foo " and " bar " and not worry about whether it was first, middle, or last, and any false positive hits on "food" or "barren" @class values:

    /bookstore/book[contains(concat(' ',@class,' '),' foo ')
            and not(contains(concat(' ',@class,' '),' bar '))]
    
    0 讨论(0)
  • 2020-12-01 09:54

    Although I like Mads solution: Here is another approach for XPath 2.0:

    /bookstore/book[
                     tokenize(@class," ")="foo" 
                     and not(tokenize(@class," ")="bar")
                   ]
    

    Please note that the following expressions are both true:

    ("foo","bar")="foo" -> true
    ("foo","bar")="bar" -> true
    
    0 讨论(0)
  • 2020-12-01 10:02

    XPath 2.0:

    /*/*[for $s in concat(' ',@class,' ') 
                return 
                   matches($s, ' foo ') 
                 and 
                  not(matches($s, ' bar '))
          ]
    

    Here no tokenization is done and $s is calculated only once.

    Or even:

    /*/book[@class
              [every $t in tokenize(.,' ') satisfies $t ne 'bar']
              [some  $t in tokenize(.,' ') satisfies $t eq 'foo']
           ]
    
    0 讨论(0)
提交回复
热议问题