xml - 使用 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属性值是唯一的
解决方案
将 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('/')
应该更紧凑和可读,但需要一段时间才能习惯。
推荐阅读
- java - 休眠注释扫描在 Gradle 5.4 下不起作用
- amazon-web-services - 字符被替换为 ? 使用复制命令时的符号
- c - 尽管发生中断,但未调用 WiringPi ISR?
- java - 如何修复在 Eclipse 上占用 java.util.concurrent.TimeUnit.MINUTES 的错误?
- javascript - 如何从这两个内容相同但结构不同的 contenteditable div 中获取相同的文本?
- android - Android:TabLayout UI 闪烁/闪烁问题
- django - DRF APIView - 如何将帮助文本添加到自动生成的表单?
- ios - 如何以编程方式快速了解最新的 ios 版本?
- pandas - 无法在 AWS Lambda 中导入 lambda_handler
- twilio - 从未调用 Twilio 录制状态回调