XPath表达式问题

时间:2010-09-16 13:40:25

标签: html xpath

我有以下HTML代码段http://paste.enzotools.org/show/1209/,我想提取具有text()后代的标记,其值为“172.80”(它是该代码段中的第四个节点)。到目前为止,我的尝试是:

'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")]]'

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

3 个答案:

答案 0 :(得分: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

的文本节点后代

答案 1 :(得分:0)

我相信你想要这样的东西:

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

string()函数将为您提供当前和后代节点中的所有文本,其中text()只为您提供当前(上下文)节点中的文本。

当然,您也可以扩展xpath选择器来过滤类名...

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

正如上面的评论中所述,您发布的xml / html无效。

答案 2 :(得分:0)

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

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

您列出的尝试都会遇到contains()仅使用节点集的第一个节点将其第一个参数转换为单个字符串的问题。因此,如果tddiv在包含“172.80”的节点之前有后代或子文本节点,则不会注意到包含“172.80”的节点。

试试这个:

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