有没有一种方法可以在for循环中查找重复值而又不返回重复值的2倍?

时间:2019-09-16 15:38:57

标签: xquery

我必须找到重复的值,而不能返回相同值的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走得更远时,您都会“忘记”已经检查过的先前位置。

谢谢。

1 个答案:

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