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" />

当两个或多个司机的分数相同时,就会看到差异。


第二个是完美的,但我不明白它是如何工作的。你能解释一下吗?

它计算得分高于当前得分的车手数量。

  • 如果司机是第一位的,那么没有司机有更多的分数 - 结果是 0(我们加 1 ==> 1st);

  • 如果车手排在第二位,那么有一个车手有更多的积分 - 所以结果是 1(我们将 1 加到那个 ==> 2nd);

  • 如果有两位车手排在第二位,那么对于他们两人来说,只有一位车手得分更高——所以他们都排在第二位;下一位车手在他前面有三位车手,所以他最终排在第 4 位 - 没有人被标记为第 3 位。

请注意,您可以通过首先将点的总和存储在变量中来提高效率,然后在表中的两个位置使用该变量,例如:

<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 回答