考虑以下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值?
发布于 2020-04-06 08:41:24
这个问题包括两个子问题:
找出最大值
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"...writes Hahahaha对每个highestJump属性。
简单XPath
注意:用于替换的XPath
.是属性本身),string()对有影响
所以:
cat jumps.xml | xmlstarlet edit --update //pupil/@highestJump -x "string(../@name)"...gives (简称):
<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)"...gives...
<?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>https://stackoverflow.com/questions/61055932
复制相似问题