使用xmlstarlet重复属性

时间:2013-07-02 10:00:21

标签: xmlstarlet

我尝试使用XMLstarlet将某些数据从XML格式转换为CSV格式。我的数据格式为

<!-- mydata.xml -->
<alldata>
    <data id="first">
        <coord><x>0</x><y>5</y></coord>
        <coord><x>1</x><y>4</y></coord>
        <coord><x>2</x><y>3</y></coord>
    </data>
    <data id="second">
        <coord><x>3</x><y>2</y></coord>
        <coord><x>4</x><y>1</y></coord>
        <coord><x>5</x><y>0</y></coord>
    </data>
</alldata>

我想将这些数据格式化为三列&#34; id&#34;,&#34; x&#34;和&#34; y&#34;得到:

first;0;5
first;1;4
first;2;3
second;3;2
second;4;1
second;5;0

我对XMLstarlet的尝试失败,表明我并不真正理解我在做什么。

xml sel -T -t -m /alldata/data -v "@id" -m /alldata/data/coord -v "concat(x,';',y)" -n mydata.xml

给了我:

first0;5
1;4
2;3
3;2
4;1
5;0
second0;5
1;4
2;3
3;2
4;1
5;0

这不是我想要或期望的。是否可以修改我的查询以获得所需的输出?

1 个答案:

答案 0 :(得分:1)

-m /alldata/data -v "@id" -m /alldata/data/coord -v "concat(x,';',y)"

主要问题是-m /alldata/data/coord:这匹配整个文档中的所有coord元素,您真正想要的只是当前coord元素下的data

-m /alldata/data -v "@id" -m coord -v "concat(x,';',y)"

您还需要每行id,因此您需要进入内循环:

-m /alldata/data -m coord -v "concat(../@id,';',x,';',y)"

此时,拥有2个嵌套循环没有任何好处,因此我们可以简化:

xml sel -T -t -m /alldata/data/coord -v "concat(../@id,';',x,';',y)" -n mydata.xml