使用XQuery检查重复项的存在

时间:2018-02-12 20:04:13

标签: xquery

我正在做一些关于XQuery的练习,我无法弄清楚如何处理这个问题 假设我的文件系统结构如此DTD:(未指定的元素只包含PCData)

<!ELEMENT RootFolder ( File | Folder )* >
<!ELEMENT File ( Name, Type, Size, CreationDate, OwnerId )>
<!ELEMENT Folder ( Name, CreationDate (File | Folder)* ) >

如何编写一个返回true / false的函数,检查每个资源(文件和文件夹)的名称是否都具有不同的路径名?

2 个答案:

答案 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)

您可以检查FolderFile是否有同一个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