我正在使用XPath解析网站。我有两个查询,一个查找我正在寻找的节点:
//td[.//text()[contains(., "Date Filed:")]]
并且没有:
//td[contains(.//text(), "Date Filed:")]
我不明白这些是如何不同的。我将它们都读作是指"查找具有包含td
的后代文本节点的Date Filed
个节点。"
有谁可以解释这些有何不同?
这是HTML,虽然我不认为它与问题相关:
<td width="40%" valign="top">
<br><br><br><br><br>
<b>Date Filed:</b> 11/13/2008<br>
<b>Jury Demand: </b> No<br><br>
<br><b>Date Terminated: </b><br>
<br><b>Date Reopened: </b><br>
<br><b>Does this action raise an issue of constitutionality?: </b>Y<br>
</td>
(不要那样看着我。我没有制作网站,美国政府没有。)
答案 0 :(得分:2)
这就是字符串转换在XPath中的工作方式:
在第二个查询contains(.//text(), "Date Filed:")
中,您调用contains
函数。它接受两个类型为string的参数,第一个参数.//text()
是node-set
数据类型,这意味着string
函数在内部被调用以将节点列表转换为string
。在这种情况下,string(.//text())
仅返回第一个文本节点。如果您将第二个查询更改为://td[contains(., "Date Filed:")]
,则会选择所需的td
。
答案 1 :(得分:0)
在XPath 1.0中,如果将节点集提供给需要字符串的函数contains()
,则它使用节点集中第一个节点的字符串值(按文档顺序)。 / p>
在XPath 2.0及更高版本中,如果将节点集提供给需要字符串的函数contains()
,则节点集将被雾化,如果结果包含多个字符串(将通常情况下,如果选择了多个节点),则会出现类型错误XPTY0004。
当您在StackOverflow上询问有关XSLT或XPath的问题时,请始终说出您正在讨论的版本。