XPath:弥补规范化空间中丢失的空白区域

时间:2013-07-06 16:31:59

标签: xpath

我目前正在开发一个项目,我需要使用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>

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

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

使用fn:string-join

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之外进行连接。