2010-07-14 5 views
2

j'ai XML comme ceci:de comptage des éléments distincts dans XSLT

<assessment> 
<variables> 
    <variable> 
    <attributes> 
    <variable_name value="FRED"/> 
    </attributes> 
    </variable> 
</variables> 
<variables> 
    <variable> 
    <attributes> 
    <variable_name value="MORTIMER"/> 
    </attributes> 
    </variable> 
</variables> 
<variables> 
    <variable> 
    <attributes> 
    <variable_name value="FRED"/> 
    </attributes> 
    </variable> 
</variables> 
</assessment> 

je sais que ce XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:output method="html"/> 

<xsl:template match="assessment"> 
    <xsl:for-each select=".//variables/variable/attributes/variable_name"> 
    <xsl:value-of select="@value"/> 
    <br/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Je génèrerait les éléments suivants:

FRED 
MORTIMER 
FRED 

Mais ce Je veux vraiment sortir est ce:

FRED: 2 
MORTIMER: 1 

En d'autres termes, je souhaite répertorier les éléments distincts et leur nombre. Notez que je veux que les éléments apparaissent dans l'ordre de leur première apparition (ce qui pourrait exclure certaines solutions qui utilisent le tri).

Comment faire?

+0

Bonne question (1). Voyez ma réponse pour une solution courte et efficace. :) –

Répondre

3

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:key name="kValueByVal" match="variable_name/@value" 
    use="."/> 

<xsl:template match="/"> 
    <xsl:for-each select=" 
    /*/*/variable/attributes/variable_name/@value 
      [generate-id() 
      = 
       generate-id(key('kValueByVal', .)[1]) 
      ] 
    "> 
    <xsl:value-of select= 
    "concat(., ' ', count(key('kValueByVal', .)), '&#xA;')"/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni, produit le résultat souhaité, correct:

FRED 2 
MORTIMER 1 
+0

un autre bon. Aussi, je pense qu'il devrait y avoir un tag ou quelque chose pour trouver facilement la réponse à toutes ces questions de regroupement. –

+1

@Alejandro: J'ai créé un tag "xslt-grouping". La seule chose qui reste est pour quelqu'un de relire toutes les questions 2000+ XSLT et re-tagger les appropriées ... :) –

+0

Merci! J'ai posté une question de suivi: http://stackoverflow.com/questions/3256791/counting-distinct-items-in-xslt-independent-of-depth –

Questions connexes