选择基于另一个标签的标签
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 用法示例:
当我有这样的 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 用法示例: