以下のような値のシーケンスを提供する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
で、重複を見つけたい値のシーケンスです。
この「動作」の説明については、次を参照してください。
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 ())
これは、シーケンス内のアイテムを反復処理し、そのアイテムと等しいシーケンス内のアイテムの数が 1 より大きい場合にそのアイテムを返します。次にdistinct-values()
、そのリストから重複を削除するために使用する必要があります。
元のセットと個別の値のセットの差を計算します。これは、複数回発生する一連の番号です。この結果セットの数値は、元のシーケンスで2回以上出現する場合は必ずしも区別されないため、必要に応じて、区別される値のセットに再度変換することに注意してください。
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>