如何使用最大子属性来更新XML属性节点?

问题描述 投票:0回答:1

考虑以下XML:

<?xml version="1.0"?>
<sportsClass>
    <pupils>
        <pupil name="Adam" highestJump="">
            <jump height="4"/>
            <jump height="1"/>
        </pupil>
        <pupil name="Berta" highestJump="">
            <jump height="4"/>
            <jump height="7"/>
        </pupil>
        <pupil name="Caesar" highestJump="">
            <jump height="1"/>
            <jump height="2"/>
        </pupil>
        <pupil name="Doris" highestJump="">
            <jump height="5"/>
            <jump height="5"/>
        </pupil>
    </pupils>
</sportsClass>

如何使用xmlstarlet用相应的最大highestJump值填充height属性节点?

xpath xmlstarlet
1个回答
1
投票
此问题包括两个子问题:

查找最大值

xmlstarlet没有max()函数,因此我们必须找到解决方法:

cat jumps.xml | \ xmlstarlet select -t -v "//pupil/jump[not(@height <= following-sibling::jump/@height) and not(@height < preceding-sibling::jump/@height)]/@height"

注意<=< –如果有多个最大值,则仅取最后一个。

结果:

4 7 2 5

更新属性

恒定的实践价值

cat jumps.xml | xmlstarlet edit --update //pupil/@highestJump -v "Hahahaha"

...将Hahahaha写入每个highestJump属性。

简单XPath

注意:用于替换的XPath

    相对于所选属性(因此.
  • 属性本身)]
  • 必须用例如。 string()生效
  • 所以:

    cat jumps.xml | xmlstarlet edit --update //pupil/@highestJump -x "string(../@name)"

    ...给(缩短):

    <pupil name="Adam" highestJump="Adam"> <pupil name="Berta" highestJump="Berta"> <pupil name="Caesar" highestJump="Caesar"> <pupil name="Doris" highestJump="Doris">

    将两者结合

    cat jumps.xml | xmlstarlet edit --update //pupil/@highestJump -x "string(../jump[not(@height <= following-sibling::jump/@height) and not(@height < preceding-sibling::jump/@height)]/@height)"

    ...给......>

    <?xml version="1.0"?> <sportsClass> <pupils> <pupil name="Adam" highestJump="4"> <jump height="4"/> <jump height="1"/> </pupil> <pupil name="Berta" highestJump="7"> <jump height="4"/> <jump height="7"/> </pupil> <pupil name="Caesar" highestJump="2"> <jump height="1"/> <jump height="2"/> </pupil> <pupil name="Doris" highestJump="5"> <jump height="5"/> <jump height="5"/> </pupil> </pupils> </sportsClass>

  • © www.soinside.com 2019 - 2024. All rights reserved.