Ответ 1
Используйте это простое выражение XPath 2.0:
$vSeq[index-of($vSeq,.)[2]]
где $vSeq
- это последовательность значений, в которых мы хотим найти дубликаты.
Для объяснения того, как это работает, см.:
У меня есть выражение XPath, которое предоставляет мне последовательность значений, подобных приведенной ниже:
1 2 2 3 4 5 5 6 7
Легко преобразовать это в набор уникальных значений 1 2 3 4 5 6 7
с помощью distinct-values()
. Однако то, что я хочу извлечь, это список повторяющихся значений = 2 5
. Я не могу придумать простой способ сделать это. Может ли кто-нибудь помочь?
Используйте это простое выражение XPath 2.0:
$vSeq[index-of($vSeq,.)[2]]
где $vSeq
- это последовательность значений, в которых мы хотим найти дубликаты.
Для объяснения того, как это работает, см.:
Как насчет:
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>