使用'位置()`提取特定元素
问题描述:
我有类似格式使用'位置()`提取特定元素
<!-- 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
我怎样才能实现我打算怎么做?
答
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
非常感谢。这正是我正在寻找的东西,并没有弄清楚我自己。 –