xmlstarlet:如果存在另一个值则查询一个值

xmlstarlet: query a value if another value is present

这是我的 xml file,我在其中尝试查询并打印 avtivebyDefault 设置为 true 的文件中所有 ID 的列表。

为此,我使用具有以下选项的 xmlstarlet sel

$ xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t -m '/x:project/x:profiles/x:profile/x:activation[x:activeByDefault="true"]' -v /x:project/x:profiles/x:profile/x:id pom.xml | sort -u aaa alto bgpcep bier coe controller daexim distribution dlux dluxapps eman faas genius groupbasedpolicy honeycombvbd infrautils jsonrpc l2switch lispflowmapping nemo netconf netvirt neutron nic ocpplugin odlparent ofconfig openflowplugin ovsdb p4plugin packetcable sfc snmp snmp4sdn sxp tsdr unimgr usc vtn vtnaaa

这里有两个问题,首先它会打印所有 id,即使它们被设置为 false,其次通过将第一个和最后一个 id 打印在一起来打印连接(例如最后一行的 vtnaaa的输出是不正确的)。我的查询中缺少什么?

尝试更改命令的这一部分:

-m '/x:project/x:profiles/x:profile/x:activation[x:activeByDefault="true"]' -v /x:project/x:profiles/x:profile/x:id 

对此:

-m '/x:project/x:profiles/x:profile[x:activation/x:activeByDefault="true"]/x:id' -v .

要分隔值,请尝试使用 -n 作为换行符或将 -v 更改为 -v concat(.,' ') 作为 space。

示例...

$ xmlstarlet sel -N x="http://maven.apache.org/POM/4.0.0" -t -m "/x:project/x:profiles/x:profile[x:activation/x:activeByDefault='true']/x:id" -v . -n pom.xml
aaa
alto
bgpcep
bier
coe
controller
daexim
distribution
dlux
dluxapps
genius
groupbasedpolicy
honeycombvbd
infrautils
jsonrpc
l2switch
lispflowmapping
nemo
netconf
netvirt
neutron
odlparent
ofconfig
openflowplugin
ovsdb
p4plugin
packetcable
sfc
snmp
snmp4sdn
sxp
tsdr
usc
vtn