XPath或XQuery以排除仅包含列表的文章节
我试图摘录一篇文章的各个部分(引言、历史、概述……)。我寻找一个XPath来选择所有以标题开头并包含一些段落的部分。如果它们只包含一个列表,则应将其丢弃 例如:XPath或XQuery以排除仅包含列表的文章节,xpath,xquery,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
<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>
....
Intro
它有段落,应该摘录
.....
工具书类
…它只有一个列表,应该被丢弃
...
....
如果XPath不可能,那么XQuery也可以工作。
我尝试了以下XQuery
for $x in doc("test.xq")//h2
return
<section>{$x/following-sibling::*[preceding-sibling::h2[1] is $x]}</section>
用于文档中的$x(“test.xq”)//h2
返回
{$x/后面的兄弟姐妹::*[前面的兄弟姐妹::h2[1]是$x]}
它根据我的需要选择节,但我无法将条件(不仅是
ul
)强加给它。不幸的是,在本例中没有创建xpath的条件
你应该扫描这棵树。找到h2后,开始收集碎片。如果在h2之前遇到p,则标记要保存的片段,否则将其删除并从该h2开始保存
它既可以使用dom结构,也可以通过文本搜索来完成。您在另一个问题中提到,这是在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 ()
对于doc中的$x(“test.xq”)//h2/以下同级::*[not(self::h2)]
group by$hId:=生成id($x/前面的同级::h2[1])
返回
如果($x[not(self::ul)]),则
{($x/前面的兄弟姐妹::h2[1],$x)}
else()
在这里,我首先查找我们要收集的所有非h2元素(根据XML的结构可能有更有效的方法),然后,
groupby
意味着在每次“迭代”中,$x
变量将是一个h2和下一个h2之间的非h2元素序列。if
条件然后检查此组中是否至少有一个元素不是ul
要提取xml片段,您需要两个引用。在xml中,所有h2都是等效的。我不能支持您的答案,提取的变体您可以在@splash58上查看,感谢您之前的回答,我将它们包括在问题中,但我不知道如何对提取的内容施加进一步的条件(因为它是有问题的)!并始终返回布尔值您需要的/*[前:$x和后:$y]
ahead@splash58我在return
之后替换了您的建议,现在它在前面的axis之后给出了错误Expecting node test
我修改了我的问题,这个问题有XQuery吗?我已经测试过了。它给出了一个元素- …
- @Win.ubuntu的结果,它将给你
ul
元素作为一个组的一部分,这个组也包括非ul元素,要求是排除只包含ul
元素而没有其他元素的组。非常感谢,是的,它可以工作(除非ul
嵌套在某些div
s中),但它会在节的任何元素(例如段落)之前重复标题