需要XPath和XQuery查询

时间:2018-05-11 16:31:31

标签: xpath xquery

我正在使用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

1 个答案:

答案 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