当我有这样的xml文件(名为test.xml
)时:
<root>
<item val="3"></item>
<items>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
</items>
</root>
我可以这样做:
xmlstarlet sel -t -v /root/item/@val -o "," -v /root/items/item[3] test.xml
会导致输出3,3
,这是可以的。但是,当/ root / item / @ val的值更改时,我不想更改xmlstarlet的命令行。
如何在3
的括号之间替换/root/item/@val
?
我尝试过:xmlstarlet sel -t -v /root/item/@val -o "," -v /root/items/item[/root/item/@val] test.xml
但是给出以下输出:
3,1
2
3
4
5
6
我在Windows上确实有此问题,我可以使用wsl
,但首选Windows解决方案...?
编辑:基于@Cyrus的建议):
此批处理文件给出了正确的结果:
@echo off
for /f "usebackq" %%f in (`xml sel -t -v /root/item/@val test.xml`) do set a=%%f
xml sel -t -o "%a%," -v /root/items/item[%a%] test.xml
但是它仍然希望有一个单行版本。
答案 0 :(得分:2)
尝试使用--var
设置一个包含@val
的变量,并将其与item
的位置进行比较...
xmlstarlet sel -t --var val="/root/item/@val" -v "$val" -o "," -v "/root/items/item[number($val)]" test.xml
另一个短一点,替代上面的/root/items/item[position()=$val]
...
/root/items/item[number($val)]
注意:使用number()
也会使您的原始尝试也起作用:
xmlstarlet sel -t -v /root/item/@val -o "," -v /root/items/item[number(/root/item/@val)] test.xml
Windows cmd使用示例: