2011-04-14 119 views
27

在上面的xml示例中,我想通過使用xpath來選擇屬於類foo而不是在類欄中的所有書籍。如何使用Xpath選擇具有多個類的元素?

<?xml version="1.0" encoding="ISO-8859-1"?> 
<bookstore> 
    <book class="foo"> 
    <title lang="en">Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
    </book> 
    <book class="foo bar"> 
    <title lang="en">Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
    </book> 
    <book class="foo bar"> 
    <title lang="en">Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
    </book> 
</bookstore> 
+2

問得好,+1。請參閱我的答案,瞭解兩種不同的XPath 2.0解決方案,其中第一種可能是所有這些解決方案中效率最高的解決方案,特別是使用非優化XPath 2.0引擎時。 – 2011-04-17 01:11:43

回答

33

通過浸軋@class值與前後的空格,您可以測試「foo」和「酒吧」的存在,而不用擔心它是否是第一,中間或最後,任何假陽性在 「食品」 或 「貧瘠」 @class值點擊:

/bookstore/book[contains(concat(' ',@class,' '),' foo ') 
     and not(contains(concat(' ',@class,' '),' bar '))] 
+1

如果'@ class'包含製表符或甚至是換行符而不是空格,該怎麼辦? 'normalize-space'函數(XPath 1.0)可以方便地從字符串中去除前後空格,並用一個空格替換空白字符的序列,例如。 'concat('',normalize-space(@class),'')' – 2015-03-01 09:27:13

+0

@Steven Pribilinskiy - 這不應該是必須的。由於屬性值是如何由XML解析器規範化的,因此製表符和回車符已經被歸一化爲一個空格。 http://www.w3.org/TR/xml/#AVNormalize – 2015-03-01 15:48:15

+0

這是一個更好的答案:http://stackoverflow.com/a/3881148/557406 – 2015-09-29 02:10:16

11

雖然我喜歡的Mads解決方案:下面是XPath 2.0中的另一種方法:

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

請注意是t他下面的表達式都爲真:

("foo","bar")="foo" -> true 
("foo","bar")="bar" -> true 
+0

+1爲XPath 2.0解決方案。使用2.0,很多事情更容易。 – 2011-04-14 11:58:10

4

的XPath 2.0:

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

這裏沒有標記化完成,$ S是隻計算一次。

甚至

/*/book[@class 
      [every $t in tokenize(.,' ') satisfies $t ne 'bar'] 
      [some $t in tokenize(.,' ') satisfies $t eq 'foo'] 
     ] 
+0

+1進行單次計算優化。 – topless 2011-04-17 12:55:52

+0

@ Chris-Top:不客氣。 – 2011-04-17 14:24:29

相關問題