xml - 如何在 xmlstarlet 中列出子元素的每个可能的父元素

标签 xml xpath 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

关于xml - 如何在 xmlstarlet 中列出子元素的每个可能的父元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42754332/

相关文章:

XML:如何在整个 xml 中搜索并通过 id 查找节点并删除它们?

android - Android中的strings.xml文件出错

c# - 创建 XML 时如何为 XML 文件指定动态名称

xslt - 是否可以选择仅包含子节点子集的节点?

c# - 如何使用 XPath for HTML 获取子节点的数量?

Xmlstarlet - 将一个属性的值复制到另一个属性(如果元素中存在)

XML 中的 Java 变量

iphone - 行计数使用 RaptureXML 返回不正确的数字

xml - clojure 从 xsd 生成 xml 和 xpath

xmlstarlet - 尝试使用 xmlstarlet 删除元素但似乎没有做任何事情