2014-03-04 105 views
0

我有類似格式使用'位置()`提取特定元素

<!-- 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>0</x><y>2</y></coord> 
     <coord><x>1</x><y>1</y></coord> 
     <coord><x>2</x><y>0</y></coord> 
    </data> 
</alldata> 

由於x值是我在XML的文件中的所有數據集相同的數據文件,我想提取數據到CSV格式類似

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

天真,我試圖在第一<data>匹配元素<coord>和使用position()提取從下一<coord>的正確<y><data>元件與第二id屬性:

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

此輸出從在輸出所有行的第一<coord><y>即使position()中的每一行被遞增:

0;5;2;1 
1;4;2;2 
2;3;2;3 

我怎樣才能實現我打算怎麼做?

回答

2

position()給出context's position(從中調用它)。 ../../data[@id='second']/coord[position()]實際上是指「每個coord下的第二個data這是在它自己的位置」(這些都是XPath 1.0字符串轉換隻是第一個)。

要引用您正在循環的coord,您可以使用XSLT函數current()。這不position()一些好的原因,我現在無法想象的工作,但你可以count()preceding-sibling節點來代替:

xml sel -T -t -m "/alldata/data[@id='first']/coord" -v "concat(x,';',y,';',../../data[@id='second']/coord[count(current()/preceding-sibling::*)+1]/y)" -n mydata.xml 
+0

非常感謝。這正是我正在尋找的東西,並沒有弄清楚我自己。 –