首页 > 解决方案 > 使用 XPath 查找具有特定后代属性的祖先属性

问题描述

这是我的 xml 文件:

<Modifications>
  <Modification Name="Acetyl" DeltaMass="42.010565" >
    <ModificationTargets>
      <Target AminoAcid="C" Classification="Post_translational" />
      <Target AminoAcid="H" Classification="Chemical_derivative" />
      <Target AminoAcid="K" Classification="Multiple" />
      <Target AminoAcid="R" Classification="Artefact" />
      <Target AminoAcid="S" Classification="Post_translational" />
      <Target AminoAcid="T" Classification="Post_translational" />
      <Target AminoAcid="Y" Classification="Chemical_derivative" />
    </ModificationTargets>
  </Modification>
  <Modification Name="Amidated" DeltaMass="-0.984016" >
    <ModificationTargets>
      <Target AminoAcid="Cte" Classification="Post_translational" />
    </ModificationTargets>
   </Modification>
<Modifications>

我想获得修改属性(@Name)

条件是属性(@Classification="Post_translational")

这是 AminoAcid 属于“Post_translational”的:

xpathExpression = "//Target[contains(@Classification,'Post_translational')]/@AminoAcid";

结果:[C, S, T, Cte]

所以我希望这个结果帮助我找到祖先属性(@Name):

xpathExpression ="//Target[@Classification='Post_translational']/ancestor::Modification/@Name";

结果:[乙酰基,酰胺化]

但我想要每个氨基酸的单独@Name:

理想结果:[乙酰基,乙酰基,乙酰基,酰胺化]

我该如何修复这个 xpathExpression?

谢谢!

标签: xmlxpath

解决方案


您遇到的问题之一是/运算符消除了重复项 - 显然,在您的情况下,4 个目标属性值中有 3 个是相同的,因此消除了两个。为避免这种情况,如果您可以使用 xpath 3.1,则可以使用避免此行为的简单 map 运算符:

//Target[@Classification="Post_translational"]!ancestor::Modification/string(@Name)

或者,您可以使用 xquery:

declare context item := document {
  your xml above
};
for $target in //Target[@Classification="Post_translational"]
return $target/ancestor::Modification/string(@Name)

在任何一种情况下,输出都应该是:

Acetyl
Acetyl
Acetyl
Amidated

推荐阅读