两个标签之间的XQuery提取

问题描述:

我目前正致力于从HTML提取数据。我想提取两个<p class="xfHeading">标签之间的文字。两个标签之间的XQuery提取

  <p class="xfHeading"><b>XYZ:</b></p> 
      <p>asdfghjk</p> 
      <p>sdsdsd</p> 
      <p>asdvcvcfghjk</p> 

     <p class="xfHeading"><b>ABC:</b></p> 
      <P>fvgbhnjm</P> 

     <p class="xfHeading"><b>PQR:</b></p> 
      <ul> 

      </ul> 

     <p class="xfHeading"><b>MNO:</b></p> 
      <ul> 
       <li>jdjshdj</li> 
      </ul> 

输出应该是:

asdfghjk

sdsdsd

asdvcvcfghjk

做到这一点

一种方法是:

/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2] 

/p[class="xfHeading"]/following-sibling::p[position()<4] 

然而,由于不断改变我需要,其中,所述两个标签<p class="xfHeading">之间的内容被提取溶液中的所有的时间之间的内容。

+0

感谢您的澄清!我用一个新建议更新了我的答案。 – nearlymonolith 2010-06-25 15:22:53

使用

(//p[@class="xfHeading"])[1] 
      /following-sibling::p 
      [. << (//p[@class="xfHeading"])[2]] 
       /text() 

这意味着:选择与的xfHeading具有值class属性继第一p元件的兄弟姐妹文档中的所有p元素的文本节点的孩子,并且同时在文档中的第二p元素之前,class属性的值为xfHeading

+0

感谢Dimitre它像宝石一样工作。你救了我的脸。 – Technocrat 2010-06-26 15:31:26

编辑:经过您的澄清,我的建议是使用FLWOR表达式,如下所示。这会根据<b>标记的唯一内容查找具有适当<b>标记内容的<p>,并返回作为其兄弟的每个<p>标记的文本。

for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p 
    where $b/text() = "XYZ:" 
     return p/text() 

注意,//是XPATH结构,不评论

OLD答案:如果没有你想要什么结果数据的样子,回答这个问题的例子是位强硬。然而,要选择,例如,一个<b>标签里面的文字,你会怎么做:

/p[class = "xfHeading"]/b/text() 

一般来说,附加text()到表达式的结束返回有问题的节点中的文本。