XSLTのノードで個別の値をカウントする方法は?
例:Countryノードの既存の国の数を数えたい場合。この場合は3になります。
<Artists_by_Countries>
<Artist_by_Country>
<Location_ID>62</Location_ID>
<Artist_ID>212</Artist_ID>
<Country>Argentina</Country>
</Artist_by_Country>
<Artist_by_Country>
<Location_ID>4</Location_ID>
<Artist_ID>108</Artist_ID>
<Country>Australia</Country>
</Artist_by_Country>
<Artist_by_Country>
<Location_ID>4</Location_ID>
<Artist_ID>111</Artist_ID>
<Country>Australia</Country>
</Artist_by_Country>
<Artist_by_Country>
<Location_ID>12</Location_ID>
<Artist_ID>78</Artist_ID>
<Country>Germany</Country>
</Artist_by_Country>
</Artists_by_Countries>
大きなドキュメントがある場合は、通常グループ化に使用される「Muenchianメソッド」を使用して、個別のノードを識別します。カウントしたいものを個別の値でインデックス付けするキーを宣言します。
_<xsl:key name="artists-by-country" match="Artist_by_Country" use="Country" />
_
次に、以下を使用して、異なる国を持つ_<Artist_by_Country>
_要素を取得できます。
_/Artists_by_Countries
/Artist_by_Country
[generate-id(.) =
generate-id(key('artists-by-country', Country)[1])]
_
そして、それをcount()
関数の呼び出しでラップすることでそれらを数えることができます。
もちろん、XSLT 2.0では、それは次のように単純です。
_count(distinct-values(/Artists_by_Countries/Artist_by_Country/Country))
_
XSLT 1.0では、これは明らかではありませんが、以下は要件のアイデアを与えるはずです:
count(//Artist_by_Country[not(Location_ID=preceding-sibling::Artist_by_Country/Location_ID)]/Location_ID)
XML内の要素が多いほど、すべての要素の先行するすべての兄弟をチェックするため、これには時間がかかります。
次のようなものを試してください。
_count(//Country[not(following::Country/text() = text())])
_
「テキストが一致する次の国がないすべての国ノードの数を教えてください」
その式の興味深いビットであるIMOは、 following 軸です。
おそらく最初の/text()
を削除し、2番目を_.
_に置き換えることもできます。
国の最初の発生時にxml生成を制御できる場合は、distinct = 'true'などの属性を国ノードに追加して、国に「使用済み」のフラグを付け、その後、それに遭遇した場合に個別の属性を追加しないようにすることができます。再び国。
その後、あなたはすることができます
<xsl:for-each select="Artists_by_Countries/Artist_by_Country/Country[@distinct='true']" />