I have an XPath expression which provides me a sequence of values like the one below:
1 2 2 3 4 5 5 6 7
It is easy to convert this to a set of unique values 1 2 3 4 5 6 7
using distinct-values()
. However, what I want to extract is the list of duplicate values = 2 5
. I can't think of an easy way to do this. Can anyone help?
Use this simple XPath 2.0 expression:
$vSeq[index-of($vSeq,.)[2]]
where $vSeq
is the sequence of values in which we want to find the duplicates.
For explanation of how this "works", see:
TLDR; This picture can be a visual explanation.
If the sequence is:
$vSeq = 1, 2, 3, 2, 4, 5, 6, 7, 5, 7, 5
Then evaluating the above XPath expression produces: 2, 5, 7
What about:
distinct-values(
for $item in $seq
return if (count($seq[. eq $item]) > 1)
then $item
else ())
This iterates through the items in the sequence, and returns the item if the number of items in the sequence that are equal to that item is greater than one. You then have to use distinct-values()
to remove the duplicates from that list.
Calculate the difference between your original set and the set of distinct values. This is the set of numbers that occur more than once. Note that numbers in this result set are not necessarily distinct if they occur more than twice in the original sequence so convert again to a set of distinct values if this is required.
What about xsl? Is it applicable to your request?
<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>
来源:https://stackoverflow.com/questions/133092/how-do-you-identify-duplicate-values-in-a-numerical-sequence-using-xpath-2-0