【发布时间】:2010-09-13 01:59:37
【问题描述】:
我有一个 XPath 表达式,它为我提供了一系列值,如下所示:
1 2 2 3 4 5 5 6 7
使用distinct-values() 很容易将其转换为一系列唯一值1 2 3 4 5 6 7。但是,我要提取的是重复值列表 = 2 5。我想不出一个简单的方法来做到这一点。有人可以帮忙吗?
【问题讨论】:
我有一个 XPath 表达式,它为我提供了一系列值,如下所示:
1 2 2 3 4 5 5 6 7
使用distinct-values() 很容易将其转换为一系列唯一值1 2 3 4 5 6 7。但是,我要提取的是重复值列表 = 2 5。我想不出一个简单的方法来做到这一点。有人可以帮忙吗?
【问题讨论】:
使用这个简单的 XPath 2.0 表达式:
$vSeq[index-of($vSeq,.)[2]]
其中$vSeq 是我们要在其中查找重复项的值序列。
有关此“工作原理”的说明,请参阅:
TLDR; 这张图可以直观的解释一下。
如果序列是:
$vSeq = 1, 2, 3, 2, 4, 5, 6, 7, 5, 7, 5
然后评估上面的 XPath 表达式产生:2, 5, 7
【讨论】:
怎么样:
distinct-values(
for $item in $seq
return if (count($seq[. eq $item]) > 1)
then $item
else ())
这将遍历序列中的项目,如果序列中等于该项目的项目数大于一个,则返回该项目。然后,您必须使用 distinct-values() 从该列表中删除重复项。
【讨论】:
计算原始值集与不同值集之间的差异。这是多次出现的一组数字。请注意,如果此结果集中的数字在原始序列中出现两次以上,则它们不一定是不同的,因此如果需要,请再次转换为一组不同的值。
【讨论】:
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>
【讨论】: