使用XQuery检查是否存在重复项

使用XQuery检查是否存在重复项,xquery,Xquery,我正在做一些关于XQuery的练习,但我不知道如何处理这个问题。 假设我有这样一个DTD结构的文件系统:(未指定的元素只包含PCData) 如何编写一个返回真/假的函数来检查每个资源(文件和文件夹)的名称是否都具有不同的路径名?此查询: declare variable $in := <Folder Name="root"> <Folder Name="user"> <File Name="Fred"/>

我正在做一些关于XQuery的练习,但我不知道如何处理这个问题。
假设我有这样一个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

好吧,你可以按路径名()分组,如果有一个组包含多个项目,你就有重复项。好吧,你可以按路径名()分组,如果有一个组包含多个项目,你就有重复项。我没想到!谢谢你没想到!非常感谢。