Ok I've hacked this together, it gets all possible combos then filters
them down:
<xsl:variable name="pairs" select="//pair"/>
<xsl:variable name="combos" as="element(table)*">
<xsl:for-each select="$pairs">
<xsl:variable name="outer" select="."/>
<xsl:for-each select="$pairs[not(. is $outer)]">
<table>
<xsl:for-each select="$outer, .">
<xsl:sort select="."/>
<xsl:copy-of select="."/>
</xsl:for-each>
</table>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
<xsl:template match="/">
<root>
<xsl:for-each-group
select="$combos[count(distinct-values(.//player)) = 4]" group-by=".">
<xsl:copy-of select="."/>
</xsl:for-each-group>
</root>
</xsl:template>
On 15 August 2011 16:00, graham.heath <graham.heath@xxxxxxxxx> wrote:
> Okay Andrew,
>
> I forgot to write out all the permutations :-)
> You could say that the example was cut down a tad too far..
> <table>
>
> <pair>
> <player>player1</player>
> <player>player4</player>
> </pair>
> <pair>
> <player>player2</player>
> <player>player3</player>
> </pair>
> </table>
>
>
>
> In your example output, where should the pair:
>>
>> <pair>
>> <player>player1</player>
>> <player>player4</player>
>> </pair>
>>
>> go?
>>
>>
>>
>> On 15 August 2011 14:38, graham.heath<graham.heath@xxxxxxxxx> wrote:
>>>
>>> Hello mega brains,
>>>
>>> I have an xml grouping problem that has so far defeated me.
>>>
>>> Given the xml
>>> <pairings>
>>> <pair>
>>> <player>player1</player>
>>> <player>player2</player>
>>> </pair>
>>> <pair>
>>> <player>player1</player>
>>> <player>player3</player>
>>> </pair>
>>> <pair>
>>> <player>player1</player>
>>> <player>player4</player>
>>> </pair>
>>> <pair>
>>> <player>player2</player>
>>> <player>player3</player>
>>> </pair>
>>> <pair>
>>> <player>player2</player>
>>> <player>player4</player>
>>> </pair>
>>> <pair>
>>> <player>player3</player>
>>> <player>player4</player>
>>> </pair>
>>> </pairings>
>>>
>>> is it possible to group pairs such that each player occurs only once in
>>> each
>>> group?
>>> <table>
>>> <pair>
>>> <player>player1</player>
>>> <player>player2</player>
>>> </pair>
>>> <pair>
>>> <player>player3</player>
>>> <player>player4</player>
>>> </pair>
>>> </table>
>>> <table>
>>> <pair>
>>> <player>player1</player>
>>> <player>player3</player>
>>> </pair>
>>> <pair>
>>> <player>player2</player>
>>> <player>player4</player>
>>> </pair>
>>> </table>
>>>
>>> I was of the opinion that some form of xsl:for-each-group would suffice
>>> but
>>> have been unable to devise a group-by expression that works..
>>> <xsl:for-each-group select="pairings/pair"
>>> group-by="count(distinct-values(player))=1">
>>> <table>
>>> <xsl:apply-templates select="current-group() "/>
>>> </table>
>>> </xsl:for-each-group>
>>>
>>> Many thanks
>>>
>>> Hector
>
>
--
Andrew Welch
http://andrewjwelch.com
|