选择基于另一个标签的标签

Selecting a tag base on another tag

当我有这样的 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 的命令行。

如何替换 /root/item/@val 括号中的 3

我试过了: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

但还是希望有单行版的。

尝试使用 --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

Windowscmd 用法示例: