我可以通过 XML 文档查询路径而不仅仅是叶子吗?

问题描述 投票:0回答:1

当我使用 XPATH 查询 XML 文档时,我只得到匹配的节点作为结果。有没有办法让匹配的节点及其父节点一直到根?

让我们看一下这个非常简单的 XML 示例:

<myStuff>
  <room name="Kitchen">
    <cupboard name="Yellow Cupboard">
      <shelf name="Upper Shelf">
        <compartment name="Left Compartment">
          <cup name="Shiny cup" />
        </compartment>
      </shelf>
    </cupboard>
  </room>
</myStuff>

当我现在想要找到

Shiny cup
时,我可以查询(例如使用
xmllint
xmlstarlet
)XPATH
"//cup[@name='Shiny cup']"
,但后来我只在文档中找到它,而不是在房间本身中找到它。有没有办法找到文档中的XPATH目标,然后将所有父节点的[属性]输出到根?

喜欢查询

"//cup[@name='Shiny cup']/<for it and each parent thats not myStuff, give @name>"

这会导致

"Shiny cup",
"Left Compartment",
"Upper Shelf",
"Yellow Cupboard",
"Kitchen"

?由于无法说出有多少步骤,因此我无法将它们静态添加到 XPATH 本身,因此该解决方案似乎应用了某种循环或递归。

xpath xmlstarlet xmllint
1个回答
0
投票

您可以沿着

ancestor-or-self
axis 行走,例如使用
xmlstarlet
:

xmlstarlet sel -t -m '//cup[@name="Shiny cup"]' -v 'ancestor-or-self::*/@name'
Kitchen
Yellow Cupboard
Upper Shelf
Left Compartment
Shiny cup
© www.soinside.com 2019 - 2024. All rights reserved.