如何在 xmlstarlet 中列出子元素的每个可能的父元素
How to list every possible parent elements of a child element in xmlstarlet
鉴于此数据:
<root>
<A>
<A1 id="1">
<elem>apple</elem>
</A1>
</A>
<B>
<B1 id="2">
<elem>banana</elem>
</B1>
</B>
<C id="3">
<elem>grapes</elem>
<C1></C1>
</C>
</root>
如何找到元素 elem 的每个可能的父元素?到目前为止,我可以通过以下方式找到使用 -m 选项的方法:
$ xmlstarlet sel -t -m '//elem/..' -v 'concat(name(),"=",@id)' -n input3.xml
A1=1
B1=2
C=3
$
但是我如何使用带 -v 的 xpath 表达式来做同样的事情?比如我只能引用父元素的id属性而不能引用父元素的名称:
$ xmlstarlet sel -t -v '//elem/../@id' input3.xml
1
2
3
$
你可以这样做:
xmlstarlet sel -t -v "name(//elem/..)" input3.xml
但这只会为您提供第一个匹配项的名称(xmlstarlet 是一个 XPath 1.0 处理器)。
如您所见,唯一的方法是首先匹配 (-m
):
xmlstarlet sel -t -m "//elem/.." -v "name()" -n input3.xml
尽管我更喜欢稍微不同的 XPath:
xmlstarlet sel -t -m "//*[elem]" -v "name()" -n input3.xml
鉴于此数据:
<root>
<A>
<A1 id="1">
<elem>apple</elem>
</A1>
</A>
<B>
<B1 id="2">
<elem>banana</elem>
</B1>
</B>
<C id="3">
<elem>grapes</elem>
<C1></C1>
</C>
</root>
如何找到元素 elem 的每个可能的父元素?到目前为止,我可以通过以下方式找到使用 -m 选项的方法:
$ xmlstarlet sel -t -m '//elem/..' -v 'concat(name(),"=",@id)' -n input3.xml
A1=1
B1=2
C=3
$
但是我如何使用带 -v 的 xpath 表达式来做同样的事情?比如我只能引用父元素的id属性而不能引用父元素的名称:
$ xmlstarlet sel -t -v '//elem/../@id' input3.xml
1
2
3
$
你可以这样做:
xmlstarlet sel -t -v "name(//elem/..)" input3.xml
但这只会为您提供第一个匹配项的名称(xmlstarlet 是一个 XPath 1.0 处理器)。
如您所见,唯一的方法是首先匹配 (-m
):
xmlstarlet sel -t -m "//elem/.." -v "name()" -n input3.xml
尽管我更喜欢稍微不同的 XPath:
xmlstarlet sel -t -m "//*[elem]" -v "name()" -n input3.xml