gpt4 book ai didi

xml - xquery:如何获取节点的不同值

转载 作者:数据小太阳 更新时间:2023-10-29 02:22:23 25 4
gpt4 key购买 nike

我想知道 Xquery 是否有类似于 distinct-values 但返回节点的函数。

让我更清楚一点:例如,我有一个引用书目,对于其中的每个作者,我想列出他写的所有书。在我的具体案例中,作者元素是这样的:

<author>
<last> Shakespear </last>
<first> William </first>
</author>

在作者身上使用不同的值会返回 ShakespearWilliam,据我所知这没有帮助。我想要一个保留元素作者结构而不考虑重复项的函数。

如果您找到其他查询方式,请告诉我。有人知道吗?

最佳答案

获取不同节点的一个问题是如何确定两个节点是不同的。这是 XML 中的一个复杂主题。如果重复节点将具有相同的节点标识(即:它们引用相同的节点),那么您可以使用类似 functx:distinct-nodes() 的函数.否则,您需要某种类型的哈希来确定节点是否“足够相等”以被视为相等,或者使用 deep-equal() 进行比较,这对于大型数据集表现不佳。

如果两个<author>当姓氏和名字相同时 s 是相等的,那么你可以使用像 concat(last,first) 这样简单的东西作为哈希并使用 xpath 获取不同的值:

$xml/author[index-of($xml/author/concat(last,first), concat(last,first))[1]]

这仍然不理想,因为您在每一步都计算哈希值,因此对于大型数据集来说速度会变慢。为了提高性能,您可以做的一件事是预先计算数据的哈希值,即:

<author hash="ShakespearWilliam">
<last>Shakespear</last>
<first>William</first>
</author>

和:

$xml/author[index-of($xml/author/@hash, @hash)[1]]

如果您可以通过哈希有效地获取有序节点(理想情况下使用有序数据库索引),那么还有一种更有效的删除重复项的方法:

declare function local:nodupes($first, $rest)
{
if (empty($rest)) then $first
else if ($first/@hash eq $rest[1]/@hash)
then local:nodupes($rest[1], subsequence($rest,2))
else ($first, local:nodupes($rest[1], subsequence($rest,2)))
};

然后用你的有序集调用它:

let $ordered :=
for $a in $xml/author
order by $a/@hash
return $a
return
local:nodupes((),$ordered)

关于xml - xquery:如何获取节点的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12693171/

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