对 XmlStarlet 的一个调用中的条件



假设我有这样一个XML文件:

<view>
  <field table="alice" name="fish"/>
  <field id="confirmation" controlType="button" enabled="some-condition">
    <title>Confirm...</title>
  </field>
  <field table="bob" name="cat"/>
  <field table="bob" name="dog" hidden="true"/>
</view>

我想输出它的所有字段,但输出取决于属性存在。

预期成果:

field 'alice.fish'
button "Confirm..." (enabled: some-condition)
field 'bob.cat'
field 'bob.dog' (hidden: true)

当前结果:

field 'alice.fish' (hidden: )
field '.' (hidden: )
field 'bob.cat' (hidden: )
field 'bob.dog' (hidden: true)
 "" (enabled: )
button "confirm" (enabled: some-condition)
 "" (enabled: )
 "" (enabled: )

通过 2 次调用 XmlStarlet:

xmlstarlet sel -t -m "//field" -o "field '" -v "@table" -o "." -v "@name" -o "' (hidden: " -v "@hidden" -o ")" -n $1
xmlstarlet sel -t -m "//field" -v "@controlType" -o " "" -v "@id" -o "" (enabled: " -v "@enabled" -o ")" -n $1

可以将 3 种不同类型的结果在 1 次调用中转换为XmlStarlet,以便田野保持其原始顺序?

您需要使用 --if 选项(--break表示当前控制结构的结束)。

xmlstarlet sel --text -t -m "//field" 
    --if "@controlType='button'" 
        -v "@controlType" -o " "" -v "title" -o "" (enabled: " -v "@enabled" -o ")" 
    --else 
        -o "field '" -v "@table" -o "." -v "@name" -o "'" 
        --if "@hidden" -o " (hidden: " -v "@hidden" -o ")" --break 
    --break 
    -n "$1"

最新更新