2011-02-07 74 views
1

我努力的目標並不位於unside標籤數據(而不是無所不包的P之外)數據Xpath的:找不包含在標籤

<p> 
    <strong>id1:</strong>data1<br /> 
    data2<br /> 
    <strong>id3:</strong>data3<br /> 
    <strong>id4:</strong>data4 
</p> 
<p> 
    <strong>id1:</strong>data1<br /> 
    data2<br /> 
    <strong>id3:</strong>data3 
</p> 

任何建議,我怎麼能得到數據1,數據2,和DATA3並能夠唯一地識別它們(例如DATA3遵循strong[.='id3:']<br/>之前結束)

編輯: DATA2總是<br/> 由於後如下DATA1

+0

好問題,1。請參閱我的回答以獲得解釋和其他幾種解決方案:) – 2011-02-07 14:08:51

回答

3

要找到緊跟<strong>id1</strong>文本節點,使用strong[.='id1']/following-sibling::text()[1](與p元素爲您的上下文節點)。

這假設你知道會有這樣的文本節點。更嚴格的測試是strong[.='id1']/following-sibling::node()[1][self::text()],它將在強元素之後找到第一個節點(任何類型的節點),並返回它,前提是它變成了文本節點。

在您的示例中,您不清楚如何識別data2。

0

它可以用text()提取。

爲前,下面的XPath插上U所需的結果

// P /文()

+0

我不能分開數據,並將其標識爲data1,2,3或4 – Moak 2011-02-07 06:01:06

+0

只是對答案的一點補充,'// p [position()== 0]/text()'添加位置以過濾出特定的p標記。 – 2011-02-07 06:01:49

2

只需使用

p/text() 

這個選擇是p元素,它們是當前節點的孩子的孩子的所有文本節點。

或者,如果要排除空白,只有文本節點,使用

p/text()[normalize-space()] 

如果你只是想選擇的第n個這樣的文本節點使用

p/text()[normalize-space()][1] 
p/text()[normalize-space()][2] 

。 。 。 。 。 。 。 。 。 。

高達

p/text()[normalize-space()][$k] 

其中$k是這樣的節點的總數:

count(p/text()[normalize-space()])