检查使用Xquery的重复项目的存在

  • 本文关键字:项目 存在 Xquery xquery
  • 更新时间 :
  • 英文 :


我在Xquery上进行一些练习,我不知道如何解决这个问题。
假设我有一个像dtd的文件系统:(未指定的元素仅包含pcdata(

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

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

而不是检查唯一性,可以通过检查 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

此查询:

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")

(在某些未定义的顺序中(

相关内容

最新更新