2013-07-02 44 views
0

我试图使用XMLstarlet将一些数据从XML格式转换为CSV。我的数据被格式化为用xmlstarlet重复属性

<!-- 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> 

我想格式化三列“ID”这一数据,“X”和“Y”来获得:

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
-m /alldata/data -v "@id" -m /alldata/data/coord -v "concat(x,';',y)" 

的主要问题是-m /alldata/data/coord

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

您也想:这一切在整个文档中的coord元素,你真正想要的是只是coord根据目前data元素相匹配id因此您需要移动到内部循环:

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

At这一点没有任何好处,有2个嵌套循环,所以我们可以简化:

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

这很好地工作。谢谢! –