13

XSLTのノードで個別の値を数える方法は?

例: 国ノードで既存の国の数を数えたいとします。この場合、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>
4

4 に答える 4

27

ドキュメントが大きい場合は、通常はグループ化に使用される「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))
于 2008-09-30T16:53:00.200 に答える
6

XSLT 1.0 では、これは明らかではありませんが、次のように要件を理解する必要があります。

count(//Artist_by_Country[not(Location_ID=preceding-sibling::Artist_by_Country/Location_ID)]/Location_ID)

XML 内の要素が多いほど、すべての要素の前の兄弟をすべてチェックするため、時間がかかります。

于 2008-09-30T14:16:31.837 に答える
5

次のようなことを試してください:

count(//Country[not(following::Country/text() = text())])

「一致するテキストを持つ次の国がないすべての国ノードの数を教えてください」

その式 IMO の興味深い部分は、次の軸です。

おそらく最初のものを削除し/text()、2番目のものを次のように置き換えることもできます.

于 2008-09-30T14:13:45.807 に答える
0

ある国の最初の発生時に xml 生成を制御できる場合は、distinct='true' などの国ノードに属性を追加して、その国に「使用済み」フラグを立て、その後、その国に遭遇した場合に個別の属性を追加しないようにすることができます。再び国。

その後、次のことができます

<xsl:for-each select="Artists_by_Countries/Artist_by_Country/Country[@distinct='true']" />
于 2008-09-30T14:21:58.393 に答える