2013-06-24 20 views
1

我已經在這裏待了好幾個小時了。我似乎無法得到這個權利。使用count()函數在XPath中進行模糊匹配

我有這個示例XML文件:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<bookstore> 

<book category="COOKING"> 
    <title lang="en">Everyday Italian</title> 
    <author>Giada De Laurentiis</author> 
    <year>2005</year> 
    <price>30.00</price> 
</book> 

<book category="CHILDREN"> 
    <title lang="en">Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
</book> 

<book category="WEB"> 
    <title lang="en">XQuery Kick Start</title> 
    <author>James McGovern</author> 
    <author>Per Bothner</author> 
    <author>Kurt Cagle</author> 
    <author>James Linn</author> 
    <author>Vaidyanathan Nagarajan</author> 
    <year>2003</year> 
    <price>49.99</price> 
</book> 

<book category="WEB"> 
    <title lang="en">Learning XML</title> 
    <author>Erik T. Ray</author> 
    <year>2003</year> 
    <price>39.95</price> 
</book> 

</bookstore> 

我試圖使用XPath的count()函數返回一個值出現了多少次在文件中(返回包含該值的元素的計數)。

我目前可以使用:

count(//*[contains(author, 'J K.')]) 

而這回 '1',這是正確的。現在,讓我們說我不知道​​我正在搜索的值位於哪個元素或屬性中。如果我嘗試使用:

count(//*[contains(/*, 'J K.')]) 

這會返回'25',它是文件中所有節點的計數。我認爲predicate中contains函數的第一個參數指定了在哪裏查找值。然而,在這種情況下,似乎表示要返回的價值。我有點困惑。我也試過這樣:

query = "count(//*[contains(/*, 'J K.')]/book/..)"; 

這也帶回正確的值,但同樣,你必須知道該值所在的級別。如果你有一個更復雜的文件和多個層次的不同節點,你仍然想搜索整個文件,那麼你如何去做呢?

+1

您的示例輸入與您提供的值不匹配。請確保包含所有相關的XML,或將您的問題與一小段但足夠大的XML(甚至更好)相匹配。例如,這應該包括超過一次的針(所有查詢'J K.'的查詢將爲該輸入產生1)。 –

回答

2

這就是說,您沒有使用謂詞中的當前上下文,而是再次從根開始。


鑑於您要查詢的一些書籍包含「JK。」,應用包含的所有書籍的背景:

count(//book[contains(., 'J K.')]) 

如果你想數出現次數的數量包含一個文本節點「JK。」標籤,很簡單,太:

count(//*[contains(text(), 'J K.')]) 

計數含針文本節點的數量會很容易,太:

count(//text()[contains(., 'J K.')]) 

計算該針的出現次數在XPath 1.0中是不可能的。在XPath 2.0,你會在拆分針的出現次數,並返回OCCURENCES數減1

count(tokenize(/, 'J K\.'))-1 

記住fn:tokenize()使用正則表達式,所以點來轉義。

+0

完美,這正是我所尋找的。謝謝。我結束了:count(// text()[contains(。,'J K.')]) – rocklandcitizen