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

时间:2020-03-06 14:43:05  来源:igfitidea点击:

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

1 2 2 3 4 5 5 6 7

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

解决方案

计算原始集与不同值集之间的差异。这是多次出现的一组数字。请注意,如果该结果集中的数字在原始序列中出现两次以上,则不一定是唯一的,因此如果需要,可以再次将其转换为一组不同的值。

关于什么:

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

这将迭代序列中的项目,如果序列中等于该项目的项目数大于一个,则返回该项目。然后,我们必须使用distinct-values()从该列表中删除重复项。

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>

使用以下简单的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/