2010-09-16 59 views
0

我有以下HTML片段http://paste.enzotools.org/show/1209/,我想提取具有值为“172.80”(它是该片段的第四个节点)的文本()后裔的标记。我迄今为止的尝试一直是:XPath表达式问题

'descendant::td[@class="roomPrice figure" and contains(descendant::text(), "172.80")]' 
'descendant::td[@class="roomPrice figure" and contains(div/text(), "172.80")]' 
'descendant::td[@class="roomPrice figure" and div[contains(text(), "172.80")]]' 

但他们都没有选择任何东西。 有没有人有任何建议?

+0

临屋的HTML片段不是有效的XML/HTML - 有'是开头title'属性' Oded 2010-09-16 13:48:36

+0

请修复您的代码。我收到错误:“错误:引用未声明的实体'nbsp'” – Topera 2010-09-16 13:49:47

+0

您使用什么来应用这些XPath查询? jQuery的?硒?它很重要。 – LarsH 2010-09-16 14:20:31

回答

1

当将节点集合传递给函数调用时,请注意如果函数签名没有声明节点集合参数,那么它会从该节点集合中转换出第一个节点。

所以,我认为你需要这个XPath表达式:

descendant::td[@class="roomPrice figure"][div[text()[contains(.,'172.80')]]] 

试验div

descendant::td[@class="roomPrice figure"] 
       [div[descendant::text()[contains(.,'172.80')]]] 

测试,对于文本节点后代文本节点孩子div

descendant::td[@class="roomPrice figure"] 
       [descendant::text()[contains(.,'172.80')]] 

试验的td

+0

+1击败了我。 :-)(请注意'descendat'中的错字。) – LarsH 2010-09-16 14:30:29

+0

@LarsH:感谢您的注意。现在它是正确的。 – 2010-09-16 14:48:51

+0

谢谢。你的解决方案有效 – elbear 2010-09-16 15:25:08

0

文本节点descendat我相信你想是这样的:

<xsl:for-each select="//td[contains(string(.), '172.80')]"> 

字符串()函数会给你所有的当前节点和后代节点中的文本wherease text()只是为您提供当前(上下文)节点中的文本。

当然,你扩展的XPath选择器来过滤在类名太...

<xsl:for-each select="//td[contains(string(.), '172.80')][@class='roomPrice figure']"> 

而且在上面的评论说,你发布的XML/HTML是无效的,因为它的立场。

+0

这是一种方法。请注意,显式的'string(。)'是多余的,因为第一个参数会隐式转换为字符串。唯一的缺点是每个td都可以用这种方式转换为字符串,这将涉及到大量不必要的字符串连接来构建将被丢弃的字符串。但这对于小型网页可能不是问题。 – LarsH 2010-09-16 14:34:04

0

我的理解是,您要在指定的类中选择td元素,该元素具有包含值“172.80”的后代文本节点。

我假设上下文节点是<tr>(或它的某个祖先)。

您列出的所有尝试均遭受仅将节点集的第一个节点转换为单个字符串的问题。因此,如果tddiv在包含“172.80”的节点之前有后代或子节点文本节点,则包含“172.80”的节点将不会被注意到。

试试这个:

'descendant::td[@class="roomPrice figure" and 
       descendant::text()[contains(., "172.80")]]' 
+0

也谢谢。您的解决方案也适用。 – elbear 2010-09-16 15:26:42

+0

@LucianU:不客气。你应该提高你认为有帮助的答案,并接受其中的一个答案。 – LarsH 2010-09-16 15:28:27

+0

LarsH,我尝试了upvoting,但我没有足够的声誉。顺便说一句,也谢谢你解释清楚的问题。我现在明白什么是错的,希望不会重复这个错误。 – elbear 2010-09-16 15:51:18