当我使用 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 本身,因此该解决方案似乎应用了某种循环或递归。
您可以沿着
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