如何用XSL XPath获取最后一个非0的<flow>元素(避免for-each)
解决方案:不用for-each获取目标元素
嘿,这个需求完全可以用纯XPath表达式实现,根本不需要for-each循环,分两种常用的XPath版本给你说明:
XPath 1.0 兼容方案(适配大多数旧环境)
如果你的环境只支持XPath 1.0,可以用这个表达式:
(//flow[. != 0][last()] | //flow[last()])[last()]
逻辑解释:
//flow[. != 0][last()]:先选中所有值不为0的<flow>元素,再取其中最后一个(也就是离文档末尾最近的非0元素)//flow[last()]:选中所有<flow>元素里的最后一个- 把这两个结果合并后取
[last()]:- 如果最后一个
<flow>的值不是0,那么两个结果里最后一个就是它本身,直接返回 - 如果最后一个
<flow>的值是0,那么合并后的结果里最后一个就是之前找到的最近非0元素(比如你的示例里的10)
- 如果最后一个
XPath 2.0+ 简洁方案(支持新版XPath的环境)
如果你的环境支持XPath 2.0及以上(比如XSLT 2.0/3.0),写法会更直观:
reverse(//flow)[. != 0][1]
逻辑解释:
reverse(//flow):把所有<flow>元素按文档顺序倒过来排列[. != 0][1]:从倒序的列表里取第一个值不为0的元素——这正好就是我们要找的:如果最后一个元素非0就取它,否则往前找最近的非0元素
验证你的示例
拿你提供的XML测试:
<root> <flow>0</flow> <flow>0</flow> <flow>0</flow> <flow>0</flow> <flow>10</flow> <flow>0</flow> </root>
两个表达式都会返回值为10的<flow>元素,完全符合需求。
内容的提问来源于stack exchange,提问作者user8318984
相关产品推荐
相关产品推荐

