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

时间:2018-03-10 06:13:51

标签: xpath xmlstarlet

以下是我的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输出的最后一行是不正确的)。我的查询中缺少什么?

1 个答案:

答案 0 :(得分:0)

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

-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(.,' ')表示空格。

示例...

$ 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