如何用xmlstarlet筛选XML并按priority排序,返回label元素值?
解决XMLStarlet筛选排序问题
原命令的问题分析
你的命令存在两处关键错误:
- 节点匹配逻辑错误:
- 用
//*匹配所有节点范围太宽泛,应该明确指定//item定位目标节点 - 筛选Workflow条件时,
param='Workflow 1'没有限定param的name属性,正确写法应为param[@name='workflow']='Workflow 1'
- 用
- 排序参数格式错误:
-s A:N:-中的多余冒号和减号不符合语法,XMLStarlet排序参数格式为-s <排序方向>:<排序类型> <XPATH>,其中:- 排序方向:
A=升序,D=降序 - 排序类型:
N=数值排序,T=文本排序
- 排序方向:
正确命令
xmlstarlet sel -t -m "//item[enabled='true' and param[@name='workflow']='Workflow 1']" -s A:N "param[@name='priority']" -v "param[@name='label']" -n file.xml
命令解释
-m "//item[enabled='true' and param[@name='workflow']='Workflow 1']":精准筛选出enabled为true且workflow参数值为Workflow 1的item节点-s A:N "param[@name='priority']":按priority参数的数值进行升序排序,对应你需要的Item C→Item B→Item A的输出顺序-v "param[@name='label']" -n:输出每个匹配节点的label参数值,并自动换行
执行结果
运行命令后将输出:
Item C Item B Item A
内容的提问来源于stack exchange,提问作者johnwangel




