我正在做一些关于XQuery的练习,我无法弄清楚如何处理这个问题 假设我的文件系统结构如此DTD:(未指定的元素只包含PCData)
<!ELEMENT RootFolder ( File | Folder )* >
<!ELEMENT File ( Name, Type, Size, CreationDate, OwnerId )>
<!ELEMENT Folder ( Name, CreationDate (File | Folder)* ) >
如何编写一个返回true / false的函数,检查每个资源(文件和文件夹)的名称是否都具有不同的路径名?
答案 0 :(得分:2)
此查询:
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
返回
("root/manager/Jane", "root/user/Fred")
(以某种未定义的顺序)
答案 1 :(得分:2)
您可以检查Folder
或File
是否有同一个Name
的兄弟姐妹来检查重复项,而不是检查唯一性。
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)
这将返回true
。