2011-02-07 47 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()])