2012-01-14 82 views
0

我想從特定文檔的子節點中提取所有文本,並返回文本數組。我認爲這將是更容易表現出來的一個例子:使用Xpath 2.0提取和分組所有文本節點

給定的文檔:

<root> 
    <div> 
     some text 
     <p>some other text</p> 
    </div> 

    <div> 
     another text 
     <b>yet another text <em>even more</em></b> 
     end of text 
    </div> 
</root> 

我想構造一個返回兩個元素的計算式:

[0] some text someother text 
[1] another text yet another text even more end of text 

我已經嘗試了許多表達式,但我似乎在這裏錯過了一些東西,很容易提取div的獨自(只是//div),但如何將它們分組和加入所有文本()子節點在每個div分別?

回答

1

text()是你的朋友在這裏:

你要做的這兩個步驟。

//div 

則:

//text() 

然後以編程方式合併。

XPath是一種查詢語言,就像CSS選擇器一樣,不能轉換東西。所有功能(如normalize-text)都可以讓您的選擇器不會修改輸入本身。

參見:how to get the normalize-space() xpath function to work?

+0

不需要。 // div/text()會返回更多的節點,因爲第一個div至少有1個文本節點,第二個至少有2個文本節點。 // div // text()將返回更多節點。我正在尋找的表達式應該分別連接每個div中的所有文本()節點。類似於// div/concat(.// text()),但它當然不起作用。 – Pma 2012-01-14 14:41:34

+0

另外我在java應用程序中使用純XPATH,我無法使用XSLT進行後處理,因此我;我正在尋找純XPATH解決方案 – Pma 2012-01-14 14:44:18

+0

他們在這裏沒有純粹的XPath解決方案,我很抱歉。把XPath想象成CSS選擇器......它們只是選擇器而不是變換器。 – greut 2012-01-14 15:04:18

1

在XPath 2.0(假設你的投入是增加了一些</b>合格的),你可以用這樣/root/div/normalize-space()的路徑,讓你的兩個字符串「一些文字一些其他文本」序列和「另一個文本,另一個文本甚至更多文本的結尾」。

+0

我曾嘗試在Saxon 9的測試Java應用程序中使用此表達式。不幸的是,有一個設置returnType的問題。來自evaluate()方法。如果我將類型設置爲XpathConstants.STRING,我只能得到第一個字符串值「some textsome other text」,我認爲該表達式應該工作。但如何將返回類型標記爲「字符串數組」?返回類型XpathConstants.NODESET不起作用,因爲我們正在處理字符串節點... – Pma 2012-01-14 14:59:15

+0

'NORMALize-space()'是一個函數而不是選擇器。 – greut 2012-01-14 15:01:54

+0

返回類型的問題在於您使用的是從未針對XPath 2.0擴展的JAXP API,因此它不允許您請求包含字符串序列的結果。改用撒克遜的s9api界面。 – 2012-01-14 15:36:25

0

XPath無法構建新節點:因爲您需要XSLT或XQuery。因此,表達式永遠不會返回源文檔中不存在的元素。但是,對於XPath 2.0,您可以輕鬆返回兩個字符串:除了較小的空白詳細信息外,您可以從表達式//div/normalize-space(.)

相關問題