首页 文章

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

提问于
浏览
1

鉴于此数据:

<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
$

1 回答

  • 2

    你可以这样做:

    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
    

相关问题