1

我目前正在做一个项目,我需要使用 XPath 提取一些地址。下面的 XPath 返回一个节点中需要的所有文本,因为使用normalize-space. 如果我删除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>

我很欣赏有关如何达到所需输出的任何建议。

提前谢谢了!

4

2 回答 2

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 之外进行连接是一个更好的主意。

于 2013-07-06T20:11:24.720 回答
0

使用fn:string-join

normalize-space(string-join((//table/tr/td[@class='shaded']/table[@cellspacing='10']/tr[2]/td[2]/text()), ','))
于 2013-07-06T16:54:11.813 回答