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

EBM*_*EBM 5 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>
Run Code Online (Sandbox Code Playgroud)

说我想改变

<banana source='Costa Rica' category='I'> 
Run Code Online (Sandbox Code Playgroud)

<banana source='Costa Rica' category='II'> 
Run Code Online (Sandbox Code Playgroud)

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


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

xmlstarlet ed -u "/fruit/banana[@source='Ecuador' @category='I']/quantity" -v 2
Run Code Online (Sandbox Code Playgroud)

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

Invalid predicate: /fruit/banana[@source='Ecuador' @category='I']/quantity
Invalid expression: /fruit/banana[@source='Ecuador' @category='I']/quantity
Run Code Online (Sandbox Code Playgroud)

EBM*_*EBM 5

经过一番反复试验,得出了一个解决方案:

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

xmlstarlet ed -u "/fruit/banana[@source='Ecuador'][@category='I']/quantity" -v 2 example.xml
Run Code Online (Sandbox Code Playgroud)

并且会正确输出:

<?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>
Run Code Online (Sandbox Code Playgroud)

编辑:也有效:

xmlstarlet ed -u "/fruit/banana[@source='Ecuador' and @category='I']/quantity" -v 2 example.xml
Run Code Online (Sandbox Code Playgroud)

  • ...您刚刚找到了我准备作为单独答案添加的另一种方法。:) (2认同)