如何使用带条件的XmlStarlet?

时间:2013-09-24 14:44:39

标签: xml shell xmlstarlet

源XML

<xml>
    <block>
        <element name="foo">92346523</element>
        <element name="bar">true</element>
    </block>
    <block>
        <element name="foo">89753298</element>
        <element name="bar">true</element>
    </block>
    <block>
        <element name="foo">67897324</element>
        <element name="bar">false</element>
    </block>
</xml>

我想使用XmlStarlet将每个<element name="bar">true</element>的值更新为同一<element name="foo">中使用Linux shell脚本的<block>的值。是否可以使用单个xml ed命令?

预期结果

<xml>
    <block>
        <element name="foo">92346523</element>
        <element name="bar">92346523</element>
    </block>
    <block>
        <element name="foo">89753298</element>
        <element name="bar">89753298</element>
    </block>
    <block>
        <element name="foo">67897324</element>
        <element name="bar">false</element>
    </block>
</xml>

1 个答案:

答案 0 :(得分:2)

假设<element name="foo">中只有一个<block>,则以下内容应该有效:

xmlstarlet ed -u '//element[@name="bar" and text()="true"]' \
              -x '../element[@name="foo"]/text()'