xml - 使用 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?
谢谢!
解决方案
您遇到的问题之一是/
运算符消除了重复项 - 显然,在您的情况下,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
推荐阅读
- wildfly - WildFly 启动时随机加载模块失败
- ruby-on-rails - will_paginate 方法有问题
- youtube-data-api - 想不通,为什么我得到一个 403
- javascript - 将弹出窗口绑定到折线以在反应传单中出现 onMouseover
- docker - 如何从主机检查 docker 容器中是否存在文件夹
- python - 适用于 Python 的 Docker SDK:fileobj
- python-3.x - 如何在 google colab 上显示叶标记?
- elixir - 如何编写 Elixir doctest 来验证空 MapSet
- windows - Intellij 可以在打开嵌入式终端时自动运行命令吗?
- python - 在 django admin 中创建用户特定的表单访问权限/验证