我正在尝试提取文章的部分(简介,历史,概述......)。我寻找一个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
)强加给它。
答案 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
的文本搜索来完成。