0

「位置」という列を生成し、各ドライバー (1、2、3) の位置を自動的に表示します。私は試してみまし<xsl:number />たが、XMLで位置を表示するだけで、それは望ましくありません。何か案は?

XSLT コード:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />
    <xsl:template match="/grid">
        <html xmlns="http://www.w3.org/1999/xhtml" >
            <body>
                <table border="1" width="100%" align="center">
                    <tr>
                        <th colspan="5">Clasificación</th>
                    </tr>
                    <tr>
                        <th>Piloto</th>
                        <th>Total</th>
                        <th>Imola</th>
                        <th>Monza</th>
                        <th>Silverstone</th>
                    </tr>               
                    <xsl:for-each select="driver">
                        <xsl:sort select="sum(points/*)" data-type="number" order="descending"/>
                        <tr>
                            <td><xsl:value-of select="name" /></td>
                            <td><xsl:value-of select="sum(points/*)" /></td>
                            <td><xsl:value-of select="points/imola" /></td>
                            <td><xsl:value-of select="points/monza" /></td>
                            <td><xsl:value-of select="points/silverstone" /></td>
                        </tr>
                    </xsl:for-each> 
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

XML コード:

<grid>
    <driver>
        <name>Driver A</name>
        <points>
            <imola>10</imola>
            <monza>2</monza>
            <silverstone>10</silverstone>
        </points>
    </driver>
    <driver>
        <name>Driver B</name>
        <points>
            <imola>9</imola>
            <monza>6</monza>
            <silverstone>7</silverstone>
        </points>
    </driver>
    <driver>
        <name>Driver C</name>
        <points>
            <imola>8</imola>
            <monza>10</monza>
            <silverstone>5</silverstone>
        </points>
    </driver>
</grid>
4

1 に答える 1

2

それは、「位置」が正確に何を意味するかによって異なります。どちらでも使用できます。

<xsl:value-of select="position()" />

また:

<xsl:value-of select="count(../driver[sum(points/*) > sum(current()/points/*)]) + 1" />

2 人以上のドライバーが同じポイント数を持っている場合、違いが見られます。


2 つ目は完璧ですが、その仕組みがわかりません。説明できますか?

現在のポイントよりも多くのポイントを獲得したドライバーの数をカウントします。

  • ドライバーが最初の場所にいる場合、より多くのポイントを持つドライバーはなく、結果は 0 です (そして、それに 1 を追加します ==> 1 番目)。

  • ドライバーが 2 位の場合、より多くのポイントを持つドライバーが 1 人存在するため、結果は 1 になります (それに 1 を足します ==> 2 位)。

  • 2 人のドライバーが 2 位の場合、どちらのドライバーも 1 人のドライバーがより多くのポイントを持っているため、両方とも 2 位になります。次のドライバーの前には 3 人のドライバーがいるため、彼は最終的に 4 位になり、3 位としてタグ付けされた人は誰もいません。

最初にポイントの合計を変数に格納してから、テーブルの 2 つの場所で変数を使用することで、これをより効率的にすることができることに注意してください。

<xsl:for-each select="driver">
    <xsl:sort select="sum(points/*)" data-type="number" order="descending"/>
    <xsl:variable name="pts" select="sum(points/*)" />
    <tr>
        <td><xsl:value-of select="count(../driver[sum(points/*) > $pts]) + 1" /></td>
        <td><xsl:value-of select="name" /></td>
        <td><xsl:value-of select="$pts" /></td>
        <td><xsl:value-of select="points/imola" /></td>
        <td><xsl:value-of select="points/monza" /></td>
        <td><xsl:value-of select="points/silverstone" /></td>
    </tr>
</xsl:for-each> 

残念ながら、ソートのために同じことを別々に計算することを避けることはできません。

于 2015-02-22T20:23:23.003 に答える