使用XQuery检查是否存在重复项
我正在做一些关于XQuery的练习,但我不知道如何处理这个问题。使用XQuery检查是否存在重复项,xquery,Xquery,我正在做一些关于XQuery的练习,但我不知道如何处理这个问题。 假设我有这样一个DTD结构的文件系统:(未指定的元素只包含PCData) 如何编写一个返回真/假的函数来检查每个资源(文件和文件夹)的名称是否都具有不同的路径名?此查询: declare variable $in := <Folder Name="root"> <Folder Name="user"> <File Name="Fred"/>
假设我有这样一个DTD结构的文件系统:(未指定的元素只包含PCData)
如何编写一个返回真/假的函数来检查每个资源(文件和文件夹)的名称是否都具有不同的路径名?此查询:
declare variable $in :=
<Folder Name="root">
<Folder Name="user">
<File Name="Fred"/>
<File Name="Bill"/>
<File Name="Fred"/>
</Folder>
<Folder Name="manager">
<File Name="Jane"/>
<File Name="Mary"/>
<File Name="Jane"/>
</Folder>
</Folder>;
declare function local:pathName($resource as element()) as xs:string {
string-join($resource/ancestor-or-self::*/@Name, '/')
};
for $resource in $in//(Folder | File)
let $path := local:pathName($resource)
group by $path
where count($resource) gt 1
return $path
(以一些未定义的顺序)此查询:
declare variable $in :=
<Folder Name="root">
<Folder Name="user">
<File Name="Fred"/>
<File Name="Bill"/>
<File Name="Fred"/>
</Folder>
<Folder Name="manager">
<File Name="Jane"/>
<File Name="Mary"/>
<File Name="Jane"/>
</Folder>
</Folder>;
declare function local:pathName($resource as element()) as xs:string {
string-join($resource/ancestor-or-self::*/@Name, '/')
};
for $resource in $in//(Folder | File)
let $path := local:pathName($resource)
group by $path
where count($resource) gt 1
return $path
(在某些未定义的顺序中)您可以通过检查
文件夹或文件是否有同名的同级来检查重复项,而不是检查唯一性
declare variable $in :=
<RootFolder>
<Folder>
<Name>user</Name>
<File>
<Name>Fred</Name>
</File>
<File>
<Name>Bill</Name>
</File>
<File>
<Name>Fred</Name>
</File>
</Folder>
<Folder>
<Name>manager</Name>
<File>
<Name>Jane</Name>
</File>
<File>
<Name>Mary</Name>
</File>
<File>
<Name>Jane</Name>
</File>
</Folder>
</RootFolder>;
declare function local:hasDupe($ctx as element()) as xs:boolean {
boolean($ctx//(File|Folder)[Name=following-sibling::*/Name])
};
local:hasDupe($in)
声明变量$in:=
用户
弗莱德
比尔
弗莱德
经理
简
玛丽
简
;
将函数local:hasDupe($ctx as element())声明为xs:boolean{
布尔($ctx//(文件|文件夹)[Name=以下同级::*/Name])
};
本地:hasDupe($in)
这将返回true
而不是检查唯一性,您可以通过检查文件夹或文件是否有同名的同级来检查重复项
declare variable $in :=
<RootFolder>
<Folder>
<Name>user</Name>
<File>
<Name>Fred</Name>
</File>
<File>
<Name>Bill</Name>
</File>
<File>
<Name>Fred</Name>
</File>
</Folder>
<Folder>
<Name>manager</Name>
<File>
<Name>Jane</Name>
</File>
<File>
<Name>Mary</Name>
</File>
<File>
<Name>Jane</Name>
</File>
</Folder>
</RootFolder>;
declare function local:hasDupe($ctx as element()) as xs:boolean {
boolean($ctx//(File|Folder)[Name=following-sibling::*/Name])
};
local:hasDupe($in)
声明变量$in:=
用户
弗莱德
比尔
弗莱德
经理
简
玛丽
简
;
将函数local:hasDupe($ctx as element())声明为xs:boolean{
布尔($ctx//(文件|文件夹)[Name=以下同级::*/Name])
};
本地:hasDupe($in)
这将返回true
好吧,你可以按路径名()分组,如果有一个组包含多个项目,你就有重复项。好吧,你可以按路径名()分组,如果有一个组包含多个项目,你就有重复项。我没想到!谢谢你没想到!非常感谢。