我正在使用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>
我需要根据名称值获取分数和标识符的值。我目前正在尝试使用以下查询但未按预期工作
fn:string-join((
for $Identifier in fn:distinct-values(FilterResults/FilterResult/Analysis[Name="XXXX"])
return fn:string-join((//Identifier,//Score),'-')),',')
我正在寻找的输出是
qwerty-0,xyz-0
答案 0 :(得分:1)
您的问题通常表明对XQuery的一些基本误解。在单个答案中解释所有内容很难,但1)这不是distinct-values
的工作原理(它返回字符串值,而不是节点),以及2)return语句中的双斜杠选择返回一切都因为它们不受任何限制。但是,在distinct-values
调用中使用的XPath非常接近。
您可以将该XPath的distinct-values
结果分配给变量,迭代它们,并生成连接字符串,而不是调用Analysis
。然后使用string-join
以逗号分隔整个序列。请注意,在return语句中,变量$a
一次仅用于concat
一对值。
string-join(
let $analyses := FilterResults/FilterResult/Analysis[Name="XXXX"]
for $a in $analyses
return $a/concat(Identifier, '-', Score),
',')
=&GT; qwerty-0,xyz-0