我有以下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> **
也就是说,我希望它只打印一次。
上述功能的功能应该是这样的。但是,它是不完整的。我尝试了一切可能的方式。请帮助我获得上面提到的输出
答案 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]