Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 规范化空间(.)和规范化空间(文本())之间有什么区别?_Xpath - Fatal编程技术网

Xpath 规范化空间(.)和规范化空间(文本())之间有什么区别?

Xpath 规范化空间(.)和规范化空间(文本())之间有什么区别?,xpath,Xpath,我正在编写一个XPath表达式,我有一个奇怪的错误,我已经纠正了,但是下面两个XPath表达式之间的区别是什么 "//td[starts-with(normalize-space()),'Posted Date:')]" 及 "//td[starts-with(normalize-space(text()),'Posted Date:')]" 主要是,第一个XPath表达式将捕获什么?因为我得到了很多奇怪的结果。那么text()在匹配中起什么作用呢?另外,如果我说normalize-sp

我正在编写一个XPath表达式,我有一个奇怪的错误,我已经纠正了,但是下面两个XPath表达式之间的区别是什么

"//td[starts-with(normalize-space()),'Posted Date:')]"

"//td[starts-with(normalize-space(text()),'Posted Date:')]"  

主要是,第一个XPath表达式将捕获什么?因为我得到了很多奇怪的结果。那么
text()
在匹配中起什么作用呢?另外,如果我说
normalize-space()
normalize-space(.)

那么,真正的问题是:
text()
之间有什么区别

是当前节点。如果在需要字符串的地方使用它(即作为
normalize-space()
)的参数),引擎会自动将节点转换为节点的字符串值,对于元素,该值是元素中连接的所有文本节点。(因为我猜问题其实是关于元素的。)

另一方面,
text()
只选择作为当前节点直接子节点的文本节点

例如,给定XML:

<a>Foo
    <b>Bar</b>
  lish
</a>
Foo
酒吧
丽斯
假设
是您的当前节点,
规范化空格(.)
将返回
Foo Bar lish
,但
规范化空格(text())
将失败,因为
text()
返回两个文本节点(
Foo
lish
)的节点集,
规范化空格()
不接受


长话短说,如果要规范化元素中的所有文本,请使用
。如果要选择特定的文本节点,请使用
text()
,但请始终记住,尽管其名称不同,
text()
仍会返回一个节点集,该节点集只有一个元素时才会自动转换为字符串。

实际上
normalize space(text())
将返回一个空字符串,因为它将文本放在根目录中
normalize space(//text())
将返回Foo,因为它通过获取第一个节点并将其转换为字符串并在其上运行
normalize space
来转换节点集。@Matthijs Bierman您尝试过吗?我有,它完全按照我说的那样工作。(在XPath2.0中,我将添加并假设上下文节点是
元素。)是的,我有(我不确定)。但我尝试了XPath1.0。标准JAXP,但使用Xerces 2.11.0:)。请尝试text()[normalize-space()]@MatthijsBierman您在哪里尝试的?哪个网站?我这样问是为了让我们能够亲自尝试,以便更好地理解。通过我自己的测试,
normalize-space()
normalize-space(.)
具有相同的效果。