XPath或XQuery以排除仅包含列表的文章部分

时间:2015-06-08 13:52:21

标签: xpath xquery

我正在尝试提取文章的部分(简介,历史,概述......)。我寻找一个XPath来选择所有以标题开头并包含一些段落的部分。如果它们只包含一个列表,则应将它们丢弃。

例如:

<h2>Intro</h2>
<p> It has paragraph and should be extracted </p>
.....
<h2>References </h2>
<ul>...It has just list and should be discarded </ul>
<h2>...</h2>
....

如果无法使用XPath,XQuery也可以运行。 我尝试了以下XQuery

for $x in doc("test.xq")//h2
return
   <section>{$x/following-sibling::*[preceding-sibling::h2[1] is $x]}</section>

它会按我的意愿选择这些部分,但我无法将条件(不仅仅是ul)强加给它。

2 个答案:

答案 0 :(得分:2)

你在另一个问题中提到这是在BaseX中,它支持XQuery 3.0 group by机制,那么如何:

for $x in doc("test.xq")//h2/following-sibling::*[not(self::h2)]
group by $hId := generate-id($x/preceding-sibling::h2[1])
return
  if ($x[not(self::ul)]) then
    <section>{($x/preceding-sibling::h2[1], $x)}</section>
  else ()

在这里,我首先找到了我们想要聚集在一起的所有非h2元素(根据XML的结构,可能有更有效的方法来执行此操作),然后是group by意味着在每次&#34;迭代&#34; $x变量将是一个h2和下一个h2之间的非h2元素的序列。然后,if条件会检查此组中是否至少有一个元素不是ul

答案 1 :(得分:1)

不幸的是,在这种情况下,没有创建xpath的条件。

您应该扫描树。当发现h2时,开始收集片段。如果在h2之前遇到p,则标记要保存的片段,否则将其删除并从该h2开始保存。

可以使用dom结构或<h<p的文本搜索来完成。