如何在XMLStarlet中过滤多个属性?

时间:2016-07-20 05:59:10

标签: xml bash xpath xmlstarlet

例如,给定:

<fruit>
   <banana source='Ecuador' category='I'>
      <quantity>1</quantity>
   </banana>
   <banana source='Costa Rica' category='I'>
      <quantity>1</quantity>
   </banana>
</fruit>

说我想改变

<banana source='Costa Rica' category='I'> 

<banana source='Costa Rica' category='II'> 

或其数量为2,如果我想过滤源和初始类别值,我将如何引用它?

我正在尝试执行以下操作:

xmlstarlet ed -u "/fruit/banana[@source='Ecuador' @category='I']/quantity" -v 2

...但是这会导致语法错误,如下所示:

Invalid predicate: /fruit/banana[@source='Ecuador' @category='I']/quantity
Invalid expression: /fruit/banana[@source='Ecuador' @category='I']/quantity

1 个答案:

答案 0 :(得分:3)

经过相当多的反复试验,达成了解决方案:

我需要关闭并使用下一个属性重新打开[]。例如:

xmlstarlet ed -u "/fruit/banana[@source='Ecuador'][@category='I']/quantity" -v 2 example.xml

并且会正确输出:

<?xml version="1.0"?>
<fruit>
  <banana source="Ecuador" category="I">
    <quantity>2</quantity>
  </banana>
  <banana source="Costa Rica" category="I">
    <quantity>1</quantity>
  </banana>
</fruit>

编辑:也有效:

xmlstarlet ed -u "/fruit/banana[@source='Ecuador' and @category='I']/quantity" -v 2 example.xml