如何使用XPath 2.0在数字序列中识别重复值?

13

我有一个XPath表达式,它给我提供了以下类似的值序列:

1 2 2 3 4 5 5 6 7

使用distinct-values(),可以轻松将其转换为唯一值序列1 2 3 4 5 6 7。然而,我想要提取的是重复值列表= 2 5。我想不到一种简单的方法来完成这个任务。有人能帮忙吗?

4个回答

23

3
非常好。我经常忽视 index-of() 函数。 - JeniT
会接受这个作为答案,但是看起来我无法再这样做了。 - Woody
没事了,谢谢@Woody。我很高兴找到你。也许版主可以帮助恢复/连接/合并您之前的账号? - Dimitre Novatchev

3

关于:

distinct-values(
  for $item in $seq
  return if (count($seq[. eq $item]) > 1)
         then $item
         else ())

这个函数会遍历序列中的所有项,如果有至少两个相同的项,就会返回该项。然后你需要使用 distinct-values() 函数来从列表中移除重复项。


2
嗨Jeni,看起来有一个更简单的解决方案:) $vSeq[index-of($vSeq,.)[2]]祝好, Dimitre - Dimitre Novatchev

0

计算您的原始集合与不同值集之间的差异。这就是出现次数多于一次的数字集合。请注意,如果在原始序列中它们出现超过两次,则此结果集中的数字并非必须是不同的,因此如果需要,可以再次转换为不同值集。


0
关于 xslt 呢? 它适用于你的请求吗?
    <xsl:for-each select="/r/a">
        <xsl:variable name="cur" select="." />
        <xsl:if test="count(./preceding-sibling::a[. = $cur]) > 0 and count(./following-sibling::a[. = $cur]) = 0">
            <xsl:value-of select="." />
        </xsl:if>
    </xsl:for-each>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接