我正在寻找一个好的解决方案(短表达式,最佳性能),以在 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属性值是唯一的