如何使normalize-space()xpath函数起作用?

Kar*_*rim 8 c# xpath

我目前正在尝试以下xpath

//tr[normalize-space(td/text())='User Name']
Run Code Online (Sandbox Code Playgroud)

让所有包含包含TD的TR 'User Name''User Name'' User Name ',但它不工作,我不知道什么是错的查询:(
我想找到的数据是按以下格式

<tr><td>User Name</td></tr>
<tr><td>User     Name</td></tr>
<tr><td>  User Name   </td></tr>
Run Code Online (Sandbox Code Playgroud)

那么编写这个xpath查询的正确格式是什么?

编辑:如果数据采用以下格式,则似乎无效

<tr><td>x</td><td>User Name</td></tr>
<tr><td>x</td><td>y</td><td>User     Name</td></tr>
<tr><td>x</td><td>y</td><td>z</td><td>  User Name   </td></tr>
Run Code Online (Sandbox Code Playgroud)

那么现在我该如何编写xpath查询?
注意:"// tr [normalize-space(td/text())='用户名']"不会工作
但是"// tr/td [normalize-space(text())='用户名']"将工作(但我想得到tr而不是td元素)

Pav*_*aev 26

现在您已经编辑了这个问题,这是有道理的.让我们考虑一下这个输入:

<tr><td>x</td><td>User Name</td></tr>
Run Code Online (Sandbox Code Playgroud)

和你的非工作查询:

//tr[normalize-space(td/text()) = 'User Name']
Run Code Online (Sandbox Code Playgroud)

现在,td/text()意味着"选择td当前节点的所有子节点的所有子文本节点".在这种情况下,这将产生由两个文本节点的节点集,xUser Name.

现在你调用normalize-space()那个节点集.唯一参数的类型normalize-space()string?.由于节点集不是字符串,因此根据XPath 1.0建议的3.2节,转换开始了:

通过调用string()函数将参数转换为类型字符串.

现在让我们看一下4.2节中string()的定义:

通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串.如果节点集为空,则返回空字符串.

在我们的示例中,第一个节点"按文档顺序"是文本节点x,因此它是将要使用的节点; 第二个节点被忽略.因此,你最终打电话normalize-space('x').当然,这不会与"用户名"相提并论.要使其工作,请使用:

//tr[td[normalize-space(text()) = 'User Name']]
Run Code Online (Sandbox Code Playgroud)

这可以转录为"选择所有tr具有子td节点的节点,其中第一个子text()节点具有规范化的字符串值User Name" - 这就是您想要的.此外,您可以将其简化为:

//tr[td[normalize-space() = 'User Name']]
Run Code Online (Sandbox Code Playgroud)

由于无参数normalize-space()将应用于当前节点(将是td),并处理其中的所有文本节点.