在 bash 脚本中使用 xmlstarlet 到 link xml 节点并提取元素

Use xmlstarlet in bash script to link xml nodes and extract elements

我对 XML 相当熟悉,但我从来没有深入研究过它的复杂性,而且我是 XSL、XPATH 和 XMLSTARLET 的新手。我需要一个 shell 脚本,它将从 XML 遵循这种格式的文件中提取一个简单的列表..

<tv>
  <channel id="ffd49fe9acd778774b4933e10b6afb75">
    <display-name>ITV</display-name>
  </channel>
  <channel id="398fe9bc5ee3b47556d06f9b9cb95562">
    <display-name>BBC One</display-name>
  </channel>
  <channel id="3932fa4d11310596e0c3eba7dc8caf4c">
    <display-name>Channel 4</display-name>
  </channel>
  <programme channel="398fe9bc5ee3b47556d06f9b9cb95562">
    <title>Pointless</title>
  </programme>
  <programme channel="ffd49fe9acd778774b4933e10b6afb75">
    <title>The Chase</title>
  </programme>
  <programme channel="398fe9bc5ee3b47556d06f9b9cb95562">
    <title>BBC News</title>
  </programme>
  <programme channel="3932fa4d11310596e0c3eba7dc8caf4c">
    <title>Naked Attraction</title>
  </programme>
</tv>

我选择了 xmlstarlet(我使用的是 Cygwin)并且我能够轻松地生成频道列表或节目列表,但是将它们链接在一起超出了我的范围,尽管我已经做了很多谷歌搜索.

#List of channels
xmlstarlet sel -t -m /tv/channel -v display-name -n

#List of Programmes
xmlstarlet sel -t -m /tv/programme -v title -n

#Filter a particular channel
sel -t -m "tv" -v 'channel[@id="398fe9bc5ee3b47556d06f9b9cb95562"]/display-name'  -n

在我看来,将最后一条语句中的方括号替换为 [@id=programme/@channel] 之类的东西似乎很简单,但 xpath 似乎不能那样工作。我正在寻找这样的结果..

Pointless, BBC One
The Chase, ITV
BBC News, BBC One
Naked Attraction, Channel 4

有人能给我指出正确的方向吗?

绕过上下文的一种方法是将匹配频道存储在变量中:

xmlstarlet sel -t -m '/tv/programme' --var ch='@channel' -v 'title' \
  -v '", "' -v '/tv/channel[@id=$ch]/display-name' -n
Pointless, BBC One
The Chase, ITV
BBC News, BBC One
Naked Attraction, Channel 4