Select 多个元素与 xmlstarlet

Select multiple elements with xmlstarlet

由于我在其他地方找不到解释过的例子,所以我以问答的形式分享我的发现。

考虑这份学生名单 (pupils.xml):

<pupils>
    <pupil>
        <firstName>Adam</firstName>
        <lastName>Amith</lastName>
        <birthDate>2000-01-01</birthDate>
    </pupil>
    <pupil>
        <firstName>Berta</firstName>
        <lastName>Bmith</lastName>
        <birthDate>2000-01-02</birthDate>
    </pupil>
    <pupil>
        <firstName>Caesar</firstName>
        <lastName>Cmith</lastName>
        <birthDate>2000-01-03</birthDate>
    </pupil>
    <pupil>
        <firstName>Doris</firstName>
        <lastName>Dmith</lastName>
        <birthDate>2000-01-04</birthDate>
    </pupil>
</pupils>

我怎样才能 select 每个学生的两个子属性得到这样的列表:

Adam Amith
Berta Bmith
Caesar Cmith
Doris Dmith

获取这个的命令是

xmlstarlet select -T -t -m "//pupil" -v "firstName" -o " " -v "lastName" -n pupils.xml

并带来:

Adam Amith
Berta Bmith
Caesar Cmith
Doris Dmith
  • -T 将输出切换为 text
  • -t -m "//pupil" -v "firstName" -o " " -v "lastName" -n定义了一个模板
    • -m "//pupil" 匹配 每个 pupil 节点
    • -v "firstName" 打印 firstName 子节点的值(当前匹配节点的子节点)
    • -o " " 打印空白
    • -v "lastName"(见上文)
    • -n 打印一个 newline
  • pupils.xml 提供输入文件

The documentation 提供更高级的参数。

您也可以在这里使用concat()

xmlstarlet sel -T -t -m //pupil -v "concat(.//firstName ,' ',.//lastName)" -n pupils.xml

具有相同的输出。