首页 > 解决方案 > 使用 XQuery/XPath 获取祖先节点的相反顺序

问题描述

我正在寻找一个好的解决方案(短表达式,最佳性能),以在 BaseX 上使用 XQuery 3.1 获得所有祖先节点的相反顺序。

现在我正在使用此代码来获取给定 XML 示例的dirA/dirA3/dirA31 :

xquery version "3.1" encoding "utf-8";

declare variable $files := 
  <dir name="dirA">
    <file name="fileA_F1"/>
    <file name="fileA_F2"/>
    <dir name="dirA1">
      <file name="fileA1_F1"/>
      <file name="fileA1_F2"/>
    </dir>
    <dir name="dirA2">
      <file name="fileA2_F1"/>
      <file name="fileA2_F2"/>
    </dir>
    <dir name="dirA3">
      <file name="fileA3_F1"/>
      <file name="fileA3_F2"/>
      <file name="fileA3_F3"/>
       <dir name="dirA31">
        <file name="fileA31_F1"/>
        <file name="fileA31_F2"/>
        <file name="fileA31_F3"/>
      </dir>
    </dir>
  </dir>;


let $path := trace(string-join($files//file[@name='fileA31_F2']/ancestor::dir/@name,'/'))

return()

这段代码可以得到相反的顺序dirA31/dirA3/dirA

let $reversepath := trace(string-join(reverse(tokenize(string-join($files//file[@name='fileA31_F2']/ancestor::dir/@name,'/'),'/')),'/'))

我的意思是,是否有任何其他 XPath 或 XQuery 表达式以相反的顺序遍历祖先?

注解:文件节点的name属性值是唯一的

标签: xmlxpathxquerybasexxquery-3.1

解决方案


将 XPath 3.1 与=>运算符一起使用的新语法 ( https://www.w3.org/TR/xpath-31/#id-arrow-operator )

let $file := $files//file[@name='fileA31_F2']
return 
    $file/ancestor::dir/@name => reverse() => string-join('/')

应该更紧凑和可读,但需要一段时间才能习惯。


推荐阅读