XSLT/XML は初めてです。
次のような XML ファイルがあります。
<event>
<division name="Div1">
<team name="Team1">
<player firstname="A" lastname="F" />
<player firstname="B" lastname="G" />
<player firstname="C" lastname="H" />
<player firstname="D" lastname="G" />
</team>
<team name="Team2">
<player firstname="A" lastname="F" />
<player firstname="B" lastname="G" />
<player firstname="C" lastname="H" />
<player firstname="D" lastname="I" />
</team>
</division>
</event>
XSL Transformation (xsltproc で使用) を作成して、同じチーム内の同じ姓を持つプレイヤーの名前を取得しようとしています。
いろいろ調べた結果、以下のようになりました。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="lastnames" match="player" use="@lastname" />
<xsl:template match="/">
<xsl:for-each select="event/division/team">
<xsl:variable name="dups" select="player[generate-id() = generate-id(key('lastnames', @lastname)[2])]" />
<xsl:if test="$dups">
Team: <xsl:value-of select="@name" /> (<xsl:value-of select="../@name" />)
Players:
<xsl:for-each select="$dups">
<xsl:value-of select="@lastname" />, <xsl:value-of select="@firstname" />.
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
これに関する主な問題は、各チーム内だけでなく、すべてのチームのすべてのプレーヤーで重複が発生することです。
上記の例では、1 つのオカレンスのみを返す必要があります (チーム 1 のプレイヤー DG)。
マイナーな問題: これは重複の 2 番目のオカレンスのみを出力します。できれば、2 回目、3 回目、4 回目... の出現を出力する必要があります (1 回目はスキップできます)。これは、キー機能の後の「[2]」が原因であることがわかっています。私が見つけたほとんどの例は、重複を削除する方法に関するものでした. おそらくこれを達成するためのより良い方法があります...
どんな助けでも大歓迎です。
ありがとう、ブルーノ