包含(。,'text')函数用于匹配文本

时间:2014-07-22 15:48:30

标签: xpath

我正在尝试选择表格中的内容,目前有以下表达式

//*[@id='row']/tbody/tr[contains(., 'user2')]/td[contains(., 'user2')]

但是,当用户输入诸如“用户25”时,这显然是一个问题,因为它还包含“用户2”。有人可以帮我修复以下表达式的错误,我试图在这些表达式中完全匹配文本值吗? (现在只是排)

//*[@id='row']/tbody/tr[text()='user2']

我也试过规范化空间,似乎没有工作

//*[@id='row']/tbody/tr[normalize-space(text())='user2']

如果它有帮助,那么页面的html

<table id="row" class="gradientTable">

<td>
                                user2


                        </td>
<td>User2</td>
<td>User2</td>
<td>user2@mail.com</td>
<td>2</td>
<td>Student</td></tr>
<tr class="even">

2 个答案:

答案 0 :(得分:0)

表达式

//*[@id='row']/tbody/tr[.//text()[normalize-space(.)='user2']]

匹配任何单个后代文本节点具有确切内容<tr>的任何user2(在空间规范化之后)。

请注意,这与示例html中的任何内容都不匹配。这个例子似乎被打破了,因为那里只有一个<tr>,它没有我们可以看到的内容。

附录:

你问,“究竟是怎么回事.// text()[]工作”?

  • .选择上下文节点(在上例中为tr元素)。
  • //text()选择任何作为后代的文本节点(前面提到的tr元素)。
  • [...]给出一个谓词“过滤”前面的表达式选择的内容。因此,在这种情况下,它会过滤作为上下文tr后代的所有文本节点,只保留那些空间规范化文本内容为“user2”的文本节点。
  • 所有这些,作为tr的谓词,意味着过滤tr元素,仅保留至少有一个后代文本节点,其空间规范化文本内容为“user2”

正如迈克尔凯指出的那样,这可能正是您想要的,也可能不是您想要的,具体取决于您是否要匹配包含user2b i的表格单元格元件。

附录2:

  

有人可以帮我修复以下表达式的错误吗?   我试图准确匹配文本值? (现在只是排)

//*[@id='row']/tbody/tr[text()='user2']

此表达式匹配的是具有直接(非孙子)文本节点的tr元素,其值正好是“user2”,例如<tr>textNode1<td>...</td>user2</tr>。由于表格中的文字通常位于td元素中,而不是直接位于tr下,因此上述表达式通常不匹配。

//*[@id='row']/tbody/tr[normalize-space(text())='user2']

除了空间规范化之外,这个表达式还会破坏=比较的一般性。换句话说......先前的XPath表达式询问tr元素是否具有任何文本节点子元素,其值为user2;但是这个只询问tr元素的第一个文本节点子节点是否具有值user2

为什么呢?因为normalize-space()函数将单个字符串值作为其参数。因此,如果您提供text()作为参数,并且有几个text()个子节点,那么您将提供节点集(或XPath 2.0中的序列)。通过获取节点集中第一个节点的converted to a string,节点集获得the string-value

要获得一般比较,通过标准化,您可以使用

//*[@id='row']/tbody/tr[text()[normalize-space(.)='user2']]

(无论如何.参数是默认的,但我更喜欢将其显式化。)同样,这只适用于tr的直接子节点的文本节点,所以你可能想要那里的后代轴:

//*[@id='row']/tbody/tr[.//text()[normalize-space(.)='user2']]

答案 1 :(得分:0)

如果您要查找包含确切值“user 2”的表格单元格(td)元素,那么您需要

//*[@id='row']/tbody/tr/td[. = 'user2']

人们经常滥用“包含”,因为他们认为它与上面的英语句子具有相同的含义,“节点包含值”。但这就是XPath中“=”的作用; XPath contains()函数测试节点的内容是否具有等于“user2”的子字符串。

请勿在此处使用text()text()表达式选择单个文本节点。但是您的内容不一定都是同一文本节点的一部分,例如它可能是"user<b>2</b>"