我是 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 转换(与 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>
这样做的主要问题是它给了我所有球队的所有球员的重复,而不仅仅是每支球队。
在上面的示例中,它应该只返回一次(对于 Team1 中的玩家 DG)。
小问题:这只会打印第二次出现的重复项。最好它应该打印第 2、3、4... 次出现(第 1 次可以跳过)。我知道这是因为键功能后面的“[2]”。我发现的大多数示例都是关于如何删除重复项,这里我需要相反的,所以这是我发现给我(接近)我需要的技巧。可能有更好的方法来实现这一点......
任何帮助表示赞赏。
谢谢,布鲁诺