我必须找到重复的值,而不能返回相同值的2倍错误(第一次在该值上使用“ for”循环,而第二次在该集合中第二次使用“ for”循环对同一值)。
我浏览了一组具有“名称”属性的项目,这些属性应该是唯一的。 现在,我有一个简单的for循环,当检测到重复项时会给我一些错误。 问题是我知道有一种方法可以解析集合,而无需考虑要测试的值的当前索引。
因此,如果我具有属性名称等于(按顺序):12、13、14、12和16的项A,B,C,D和E,则当前循环将返回2次错误。 第一次是因为它检测到项目A与项目D具有相同的值,第二次是因为它检测到项目D与A具有相同的值。
<errors>
{
let $LPsList := //TrainingContextCommsCol/theContextsComms/theComms/theOldiComms/ref-LPsList
for $LP in $LPsList
let $LPDup := $LPsList[name = $LP/name]
return
if (count($LPDup) > 1) then
<error id="{$rule_id}">
<args>
<arg value="{$LP/name}"/>
</args>
<location value="{functx:path-to-node-with-pos($LP)}"/>
</error>
else ()
}
</errors>
我知道,如果您对从索引i +1开始的序列中的值进行计数以消除当前位置,则有一种方法可以检查重复项,但是我不知道该怎么做。 这样,每次FOR走得更远时,您都会“忘记”已经检查过的先前位置。
谢谢。
答案 0 :(得分:1)
假设XQuery 3或3.1:
<errors>
{
let $LPsList := //TrainingContextCommsCol/theContextsComms/theComms/theOldiComms/ref-LPsList
for $LP in $LPsList
group by $name := $LP/name
where tail($LP)
return
<error id="{$rule_id}">
<args>
<arg value="{$name}"/>
</args>
<location value="{functx:path-to-node-with-pos($LP[1])}"/>
</error>
}
</errors>
我认为tail
在XQuery 3.0中可能不可用,但是您当然可以使用where $LP[2]
。