'XPath/XSLT select only where count is less than number
Given the structure below. How would you go about selecting only those elements where the number of elements of same group is less than - let's say six. In this sample it would mean we'll only select data in group B, C, E and F.
I have played with distinct-values and this:
//distinct-values(data/@group)
gives me the list of distinct values in the xml, but trying to combine the output with count and others - ends up giving me the number 31 which is the total number of elements.
Any pointers are welcome
<datas>
<data group="A">A</data>
<data group="A">A</data>
<data group="A">A</data>
<data group="A">A</data>
<data group="A">A</data>
<data group="A">A</data>
<data group="A">A</data>
<data group="A">A</data>
<data group="A">A</data>
<data group="A">A</data>
<data group="B">B</data>
<data group="B">B</data>
<data group="B">B</data>
<data group="B">B</data>
<data group="C">C</data>
<data group="C">C</data>
<data group="D">D</data>
<data group="D">D</data>
<data group="D">D</data>
<data group="D">D</data>
<data group="D">D</data>
<data group="D">D</data>
<data group="D">D</data>
<data group="D">D</data>
<data group="D">D</data>
<data group="E">E</data>
<data group="E">E</data>
<data group="E">E</data>
<data group="E">E</data>
<data group="F">F</data>
<data group="F">F</data>
</datas>
Solution 1:[1]
Depending on what you are doing with your data and seeing you tagged your question as XSLT, something like this could also be useful :
<xsl:for-each-group select="datas/data" group-by="@group">
<xsl:if test="count(current-group()) lt 6">
<group><xsl:value-of select="current-grouping-key()"/></group>
</xsl:if>
</xsl:for-each-group>
Solution 2:[2]
After more research I found a solution which seems to work.
for $d in //distinct-values(data/@group) return //data[@group=$d and count(//data[@group=$d]) <= 7]
Does anyone agree this is a valid solution?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Sebastien |
| Solution 2 | Trond |
