2017-01-24 2 views
0

sagen, ich habe eine Liste von Farben wie folgt aus:Count Knoten durch Attribut Vergleich Werte

<colors> 
    <color>Red</color> 
    <color>Green</color> 
    <color>Blue</color> 
</colors> 

Und ich habe eine beliebige Anzahl von Elementen, von denen jedes eine Farbe haben:

<items> 
    <item color="Blue"/> 
</items> 

Now I will für jede Farbe zeigen, wie viele Elemente es mit dieser Farbe ist:

<xsl:for-each select="//color"> 
    <xsl:value-of select="."/>: <xsl:value-of select="count(//item[@color = ...])"/>&#10; 
</xsl:for-each> 
No color: <xsl:value-of select="count(//item[not(@color)])"/> 

Aber ich habe keine Ahnung, wie alle t wählen Er vergleicht sie mit der aktuellen Farbe. Kann mir jemand in die richtige Richtung zeigen?

Danke!

Antwort

1

Ich würde vorschlagen, dass Sie eine key verwenden, um die Elemente nach ihrer Farbe zu verknüpfen. Zum Beispiel gegeben:

XML

<root> 
    <colors> 
     <color>Red</color> 
     <color>Green</color> 
     <color>Blue</color> 
    </colors> 
    <items> 
     <item color="Red"/> 
     <item color="Green"/> 
     <item color="Blue"/> 
     <item color="Green"/> 
     <item color="Blue"/> 
     <item color="Blue"/> 
    </items> 
</root> 

das folgende Stylesheet:

XSLT 1,0

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

<xsl:key name="item-by-color" match="item" use="@color" /> 

<xsl:template match="/root"> 
    <xsl:for-each select="colors/color"> 
     <xsl:value-of select="."/> 
     <xsl:text>: </xsl:text> 
     <xsl:value-of select="count(key('item-by-color', .))"/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

zurückkehren wird:

Red: 1 
Green: 2 
Blue: 3 

Wenn Sie möchten, auch ohne Farbe Artikel zählen, die Schlüsseldefinition ändern:

<xsl:key name="item-by-color" match="item" use="string(@color)" /> 

dann verwenden:

<xsl:value-of select="count(key('item-by-color', ''))"/> 
+0

Dank! Ich hatte das Gefühl, dass mir etwas fehlte. Ich nehme an, dass es ohne einen Schlüssel nicht möglich ist? –

+0

Es ist möglich, wenn Sie ''. Aber ist nicht nur weniger elegant, es ist auch weniger effizient. –