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返回由于使用规范化空间而在一个节点中需要的所有文本。如果我删除normalize空格,那么所需的文本将在3个不同的节点中返回,分别是地址、城市和邮政编码以及国家。使用normalize space将所有3个节点合并为一个节点,但会弄乱地址的空白,如下所示 XPath 返回 22-13 20 St., 3nd Fl., FrontStaten Island City, New York 12101United States

我目前正在进行一个项目,需要使用XPath提取一些地址。下面的XPath返回由于使用规范化空间而在一个节点中需要的所有文本。如果我删除normalize空格,那么所需的文本将在3个不同的节点中返回,分别是地址、城市和邮政编码以及国家。使用normalize space将所有3个节点合并为一个节点,但会弄乱地址的空白,如下所示

XPath

返回

22-13 20 St., 3nd Fl., FrontStaten Island City, New York 12101United States
期望输出

22-13 20 St., 3nd Fl., Front, Staten Island City, New York 12101, United States
HTML

我很感激任何关于如何达到预期产出的建议

非常感谢

使用


从您的其他问题来看,我想您只能使用XPath1.0,其中dikk的答案对字符串连接没有帮助。。。很方便,但只能从XPath2.0开始使用

在XPath 1.0中,必须使用concat…,它只能连接固定数量的节点。如果行数始终相同,则可以

concat(
  normalize-space(//td[2]/text()[1]), ', ',
  normalize-space(//td[2]/text()[2]), ',',
  normalize-space(//td[2]/text()[3])
)
不可能加入不同数量的文本节点。如果行数不同,但保持小于某个大小,则可以使用此相当肮脏的方法:

substring-before(concat(
  normalize-space(//td[2]/text()[1]), ', ',
  normalize-space(//td[2]/text()[2]), ', ',
  normalize-space(//td[2]/text()[3]), ', ',
  normalize-space(//td[2]/text()[4]), ', ', ', '
), ', , ')
并根据需要扩展模式

如果文本节点不存在,那么将在输出中返回一个空字符串,从而获得。通过在末尾添加此模式并从它开始剪切所有内容,可以解决缺少的字符串连接。。。如果您知道要加入的项数的上限,但查询会变得非常臃肿。也许在XPath之外进行连接是一个更好的主意

normalize-space(string-join((//table/tr/td[@class='shaded']/table[@cellspacing='10']/tr[2]/td[2]/text()), ','))
concat(
  normalize-space(//td[2]/text()[1]), ', ',
  normalize-space(//td[2]/text()[2]), ',',
  normalize-space(//td[2]/text()[3])
)
substring-before(concat(
  normalize-space(//td[2]/text()[1]), ', ',
  normalize-space(//td[2]/text()[2]), ', ',
  normalize-space(//td[2]/text()[3]), ', ',
  normalize-space(//td[2]/text()[4]), ', ', ', '
), ', , ')