考虑以下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
属性节点?
查找最大值
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>