考虑以下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
属性节点?
答案 0 :(得分: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
.
是属性本身)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>