【问题标题】:XPath: Make up for lost white space from normalize-spaceXPath:从规范化空间中弥补丢失的空白
【发布时间】:2013-07-06 16:31:58
【问题描述】:

我目前正在处理一个需要使用 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>

感谢任何有关如何达到所需输出的建议。

非常感谢!

【问题讨论】:

    标签: xpath


    【解决方案1】:

    使用fn:string-join

    normalize-space(string-join((//table/tr/td[@class='shaded']/table[@cellspacing='10']/tr[2]/td[2]/text()), ','))
    

    【讨论】:

      【解决方案2】:

      根据您的其他问题,我猜您只能使用 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 之外进行连接是一个更好的主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        相关资源
        最近更新 更多