如何用XPath/XQuery根据Name节点值获取Score和Identifier节点值
XPath/XQuery查询:根据同级Name获取对应Score和Identifier值
我来帮你搞定这个XPath/XQuery的问题!先看你的XML结构:
<FilterResults> <FilterResult> <ID>535</ID> <Analysis> <Name>ZZZZ</Name> <Identifier>asdfg</Identifier> <Result>High</Result> <Score>0</Score> </Analysis> <Analysis> <Name>XXXX</Name> <Identifier>qwerty</Identifier> <Result>Medium</Result> <Score>0</Score> </Analysis> </FilterResult> <FilterResult> <ID>745</ID> <Analysis> <Name>XXXX</Name> <Identifier>xyz</Identifier> <Result>Critical</Result> <Score>0</Score> </Analysis> <Analysis> <Name>YYYY</Name> <Identifier>qwerty</Identifier> <Result>Medium</Result> <Score>0</Score> </Analysis> </FilterResult> </FilterResults>
你的需求很明确:基于Name节点的值(这里是"XXXX"),获取对应的Identifier和Score值,把每一组用-连接,多组结果用,分隔,最终得到qwerty-0,xyz-0这样的输出。
问题出在哪?
你之前的查询有两个关键问题:
- 使用
//Identifier和//Score会全局查找所有对应的节点,而不是当前匹配的Analysis节点下的子节点,这会导致结果混乱; fn:distinct-values在这里完全没必要,你需要的是每个符合条件的Analysis下的对应值,不是去重后的结果。
正确的查询语句
试试这个XQuery:
fn:string-join( for $analysis in FilterResults/FilterResult/Analysis[Name="XXXX"] return fn:string-join(($analysis/Identifier/text(), $analysis/Score/text()), '-'), ',' )
解释一下逻辑
- 首先遍历所有
Name等于"XXXX"的Analysis节点,把每个节点赋值给变量$analysis; - 对每个
$analysis,取出它自身的Identifier和Score的文本值,用-拼接成一组; - 最后把所有拼接好的组用
,连接起来,正好得到你想要的输出。
运行这个查询后,输出就是你期望的:qwerty-0,xyz-0
内容的提问来源于stack exchange,提问作者user2658628
相关产品推荐
相关产品推荐

