Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > сортировка по сумме полей


Автор: Nicola_S 13.8.2008, 21:45
есть XML

Код

<GROUP>
    <Node number="1">
     <User Id="1" Name="User1" Points="10" />
     <User Id="2" Name="User2" Points="20" />
     <User Id="3" Name="User3" Points="10" />
    </Node>
    <Node number="2">
     <User Id="1" Name="User1" Points="30" />
     <User Id="2" Name="User2" Points="50" />
     <User Id="3" Name="User3" Points="10" />
    </Node>
    <Node number="3">
     <User Id="1" Name="User1" Points="20" />
     <User Id="2" Name="User2" Points="20" />
     <User Id="3" Name="User3" Points="10" />
    </Node>
</GROUP>



необходимо с помощью XSL получить такую таблицу

UserName     Node1    Node2    Node3   Total
-----------------------------------------------------------
User2               20          50          20        90
User1               10          30          20        60
User3               10          10          10        30



т.е. вывести данные каждого Node для пользователя отсортированные по сумме значений во всех Node


заранее спасибо

Автор: Nicola_S 14.8.2008, 11:36
спасибо всем, задачу решил...

Автор: Arsenius 19.8.2008, 14:27
Хоть задача и решена, позвольте выложить как вариант решения:

Код

<body>                           
    <table border="1">
        <tbody>
            <tr>
                <td>User</td>
                <xsl:for-each select="//Node">
                    <td>Node <xsl:value-of select="@number"/></td>
                </xsl:for-each>
                <td>Total</td>    
            </tr>    
            <xsl:for-each select="//User[not(@Id = preceding::User/@Id)]">
                <xsl:sort order="descending" data-type="number" select="@Points"/>
                <tr>
                    <td>
                        <xsl:value-of select="@Name"/> 
                    </td>
                    <xsl:for-each select="//User[@Id = current()/@Id]">
                    <td>
                        <xsl:value-of select="@Points"/>
                    </td>
                </xsl:for-each>
                <td>
                    <b><xsl:value-of select="sum(following::User[@Id = current()/@Id]/@Points ) + sum(preceding::User[@Id = current()/@Id]/@Points ) + sum(self::User[@Id = current()/@Id]/@Points )"/></b>
                </td>
            </tr>
            </xsl:for-each>
        </tbody>
    </table>
</body>


И еще момент, а что если добавить в Node еще одного пользователя? 

Например: 

Код

<User Id="4" Name="User4" Points="5" />


т.е. вот так

Код

<GROUP>
    <Node number="1">
        <User Id="1" Name="User1" Points="10" />
        <User Id="2" Name="User2" Points="20" />
        <User Id="3" Name="User3" Points="10" />
        <User Id="4" Name="User4" Points="5" />
    </Node>
    <Node number="2">
        <User Id="1" Name="User1" Points="30" />
        <User Id="2" Name="User2" Points="50" />
        <User Id="3" Name="User3" Points="10" />
    </Node>
    <Node number="3">
        <User Id="1" Name="User1" Points="20" />
        <User Id="2" Name="User2" Points="20" />
        <User Id="3" Name="User3" Points="10" />
    </Node>    
</GROUP>


И в результате получить такое:

User       Node 1   Node 2   Node 3   Total 
User2     20          50           20          90  
User1     10          30           20          60  
User3     10          10           10          30  
User4     5             -             -             5

Автор: Nicola_S 19.8.2008, 16:42
Спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)