Mar*_*mid 2 xml xpath xquery basex xquery-3.1
我正在寻找一个好的解决方案(简短表达,最佳性能),以在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()
Run Code Online (Sandbox Code Playgroud)
和此代码获得相反的顺序dirA31 / dirA3 / dirA:
let $reversepath := trace(string-join(reverse(tokenize(string-join($files//file[@name='fileA31_F2']/ancestor::dir/@name,'/'),'/')),'/'))
Run Code Online (Sandbox Code Playgroud)
我的意思是,是否还有其他XPath或XQuery表达式以相反的顺序遍历祖先?
注释:文件节点的名称属性值是唯一的
使用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('/')
Run Code Online (Sandbox Code Playgroud)
应该更紧凑,更易读,但要花一些时间才能习惯。
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |