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

时间:2008-09-25 12:44:29

标签: xml xpath xpath-2.0

我有一个XPath表达式,它为我提供了一系列值,如下所示:

1 2 2 3 4 5 5 6 7

使用1 2 3 4 5 6 7很容易将其转换为一组唯一值distinct-values()。但是,我要提取的是重复值列表= 2 5。我想不出一个简单的方法来做到这一点。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:17)

使用这个简单的XPath 2.0表达式

$vSeq[index-of($vSeq,.)[2]]

其中$vSeq是我们想要找到重复项的值序列。

有关此“有效”的说明,请参阅

<强> http://dnovatchev.wordpress.com/2008/11/16/xpath-2-0-gems-find-all-duplicate-values-in-a-sequence-part-2/

TLDR; 这张照片可以是一个直观的解释。

如果序列是:

$vSeq  =  1,   2,   3,   2,   4,   5,   6,   7,   5,   7,   5

然后评估上面的XPath表达式会产生:2, 5, 7


enter image description here

答案 1 :(得分:3)

怎么样:

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

这将遍历序列中的项目,如果序列中与该项目相等的项目数大于1,则返回该项目。然后,您必须使用distinct-values()从该列表中删除重复项。

答案 2 :(得分:1)

计算原始集与不同值集之间的差异。这是不止一次出现的数字集。请注意,如果结果集中的数字在原始序列中出现的次数超过两次,则它们不一定是不同的,因此如果需要,则再次转换为一组不同的值。

答案 3 :(得分:-1)

xsl怎么样? 它适用于您的要求吗?

    <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>