省略了返回文本中不需要部分的xpath表达式

时间:2014-08-26 14:52:59

标签: html regex parsing xpath

假设您已使用htmlTreeParse()获取此XML代码片段:

   <div class="right_location">
      <h3>Office Locations</h3>
      <div class="right_location_in">
          <h4>
             <a href="/?t=10&L=234&format=XML&p=5406">Akron Office</a>
          <h4>
          <address>
          <address>
  </div>
  <div class="right_location_in">
         <h4>
            <a href="/?t=10&L=235&format=XML&p=5406">Cleveland Office</a>

有一些未知数量的办公室,但这个表达式会返回它们。所有人都附加了#34;办公室&#34;

xpathSApply(doc, "//div[@class ='right_location']//a", xmlValue, trim = TRUE)
[1] "Akron Office"

如何排除不需要的&#34; Office&#34;从每一个?我想我不能使用contains()的否定因为表达式不匹配。也许text()有能力省略指定的文本?

substring-befor()的答案很好,但我需要让它为每个位置运行,而不仅仅是第一个位置。

1 个答案:

答案 0 :(得分:2)

以下XPath将从您的XML返回“Akron”:

substring-before(//div[@class ='right_location']//a[1], ' Office')

备注:

  1. 使用a[1]选择可能多个a的第一个。
  2. 使用substring-before删除' Office'
  3. 处理每个匹配的a通常在XPath 本身之外完成(在XSLT或Python或其他托管语言中,从中调用XPath库进行选择),但是如果你正在使用XPath 2.0 ,你可以考虑(a)使用for expression,(b)使用MathiasMüller建议的tokenize()和“Office”作为分隔符,或者(c)如果只是想在没有“办公室”的情况下找回“阿克伦克利夫兰”,replace()“办公室”什么也没有。