Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath或XQuery以排除仅包含列表的文章节_Xpath_Xquery - Fatal编程技术网

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

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

我试图摘录一篇文章的各个部分(引言、历史、概述……)。我寻找一个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>
....
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中),但它会在节的任何元素(例如段落)之前重复标题