根据其他标签选择标签

时间:2020-10-27 11:54:48

标签: xml batch-file xpath windows-subsystem-for-linux xmlstarlet

当我有这样的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

但是它仍然希望有一个单行版本。

1 个答案:

答案 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使用示例:

enter image description here