gpt4 book ai didi

xpath - XQuery:按特定顺序查找具有后代的节点

转载 作者:行者123 更新时间:2023-12-04 02:03:55 24 4
gpt4 key购买 nike

我有一个 XML 文件,它表示一本书中所有句子的语法树:

<book>
<sentence>
<w class="pronoun" role="subject">
I
</w>
<wg type="verb phrase">
<w class="verb" role="verb">
like
</w>
<wg type="noun phrase" role="object">
<w class="adj">
green
</w>
<w class="noun">
eggs
</w>
</wg>
</wg>
</sentence>
<sentence>
...
</sentence>
...
</book>

这个例子是假的,但重点是实际的单词( <w> 元素)基于句法关系以不可预测的方式嵌套。

我要做的是找到 <sentence>具有 <w> 的节点以特定顺序匹配特定条件的子项。例如,我可能正在寻找带有 w[@class='pronoun'] 的句子。后代后跟 w[@class='verb']后裔。

很容易找到只包含两个后代的句子,而不用关心排序:
//sentence[descendant::w[criteria1] and descendant::w[criteria2]]

我确实设法找出了这个符合我要求的查询,它寻找 <w>与以下 <w>与相同的最接近的条件匹配 <sentence>祖先:
for $sentence in //sentence
where $sentence[descendant::w[criteria1 and
following::w[(ancestor::sentence[1] = $sentence) and criteria2]]]
return ...

...但不幸的是它很慢,我不知道为什么。

是否有一种非慢速方法来搜索包含按特定顺序匹配条件的后代的节点?我将 XQuery 3.1 与 BaseX 一起使用。如果我找不到使用 XQuery 执行此操作的合理方法,则计划 B 是使用 Python 进行后处理。

最佳答案

following axis 确实很昂贵,因为它跨越了文档的所有后续节点,这些节点既没有后代也没有祖先。

节点比较运算符( <<>>is )可以在这里帮助您。在下面的代码示例中,检查是否至少有一个动词后跟名词:

for $sentence in //sentence
let $words1 := $sentence//w[@class = 'verb']
let $words2 := $sentence//w[@class = 'noun']
where some $w1 in $words1 satisfies
some $w2 in $words2 satisfies $w1 << $w2
return $sentence

关于xpath - XQuery:按特定顺序查找具有后代的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59759563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com