如何在xquery中打印唯一值

时间:2013-11-26 21:34:11

标签: xquery

我有以下XQuery功能。

declare function local:format($input as element() *) as element() *{

for $v in

$input
return if
 (((for $x in $input return $x)/@one=$v/@two)   and ((for $y in $input return $y)/@two=$v/@one))
        then
        (   





         )

        else {$v}


};

上述功能的输入是:

**  <pair two="IN011" one="IN007">  David Emma  </pair>  **


   **   <pair two="IN007" one="IN011">   Emma David    </pair>  **

但我想要的输出是:

**    <pair two="IN011" one="IN007">   David Emma   </pair>  **

或者:

**    <pair two="IN007" one="IN011">   Emma David   </pair>  **

也就是说,我希望它只打印一次。

上述功能的功能应该是这样的。但是,它是不完整的。我尝试了一切可能的方式。请帮助我获得上面提到的输出

1 个答案:

答案 0 :(得分:1)

您要做的是规范化源序列中的值,并根据规范化的字符串返回不同的值:

declare function local:normalize(
  $label as xs:string
) as xs:string
{
  string-join(
    for $t in tokenize($label, '\s+')
    order by $t 
    return $t)
};

let $pairs := (<pair two="IN011" one="IN007">  David Emma  </pair>,
  <pair two="IN007" one="IN011">   Emma David    </pair>)
let $pairs-normalized :=
  for $p in $pairs
  return element pair {
    $p/@*,
    attribute hash { local:normalize($p) },
    $p/node()
  }
return $pairs-normalized[index-of($pairs-normalized/@hash, @hash)[1]]

=&GT; <pair two="IN011" one="IN007" hash="DavidEmma"> David Emma </pair>

另一种方法是使用distinct-values

for $d in distinct-values($pairs-normalized/@hash)
return ($pairs-normalized[@hash = $d])[1]