2013-07-02 57 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

這很好地工作。謝謝! –