我目前正在开发一个项目,我需要使用XPath提取一些地址。由于使用normalize-space
,下面的XPath返回一个节点中所需的所有文本。如果我删除normalize-space
,则在3个不同的节点中返回所需的文本,分隔地址,城市和邮编以及国家/地区。使用normalize-space
将所有3个节点合并为一个节点,但会弄乱地址的空白区域,如下所示。
的XPath
normalize-space(//table/tr/td[@class='shaded']/table[@cellspacing='10']/tr[2]/td[2])
返回
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
<td>
<span class="dispaly">
Address:
</span>
</td>
<td>
22-13 20 St., 3nd Fl., Front
<br>
Staten Island City, New York 12101
<br>
United States
</td>
我很欣赏有关如何达到所需输出的任何建议。
非常感谢提前!
答案 0 :(得分:0)
normalize-space(string-join((//table/tr/td[@class='shaded']/table[@cellspacing='10']/tr[2]/td[2]/text()), ','))
答案 1 :(得分:0)
从你的其他问题我想你只能使用XPath 1.0,其中dikk的答案没有帮助(string-join(...)
很方便,但只能从XPath 2.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]), ', ', ', '
), ', , ')
(并根据需要扩展模式)
如果文本节点不存在,将返回一个空字符串,因此您将在输出中获得, ,
。通过在最后添加此模式并从中剪切所有内容,如果您知道要加入的项目数的上限,则可以解决缺少的string-join(...)
,但查询会变得非常臃肿。也许最好在XPath之外进行连接。