如何自动编号 table 行?
How to autonumber table rows?
我想生成一个名为 "Position" 的列并自动显示每个驾驶员 (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>
这取决于您所说的 "position" 的确切含义。您可以使用其中之一;
<xsl:value-of select="position()" />
或:
<xsl:value-of select="count(../driver[sum(points/*) > sum(current()/points/*)]) + 1" />
当两个或更多车手的积分相同时,就会看到差异。
The second one is perfect, but I don't understand how it works. Can
you explain it?
统计比当前积分多的车手数。
如果驱动排在首位,则没有驱动
有更多的点 - 结果是 0(我们加 1 ==> 1st);
如果车手排在第二位,那么有一个车手的积分更多-所以结果是1(我们加1==>第二);
如果有两位车手排在第二位,那么对于他们两人来说,恰好有一位车手的积分更多——所以他们都排在第二位;下一位车手前面有三位车手,所以他最终排在第 4 位 - 没有人被标记为第 3 位。
请注意,您可以先将点的总和存储在一个变量中,然后在 table 的两个位置使用该变量,例如:
<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>
不幸的是,无法避免为排序单独计算相同的东西。
我想生成一个名为 "Position" 的列并自动显示每个驾驶员 (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>
这取决于您所说的 "position" 的确切含义。您可以使用其中之一;
<xsl:value-of select="position()" />
或:
<xsl:value-of select="count(../driver[sum(points/*) > sum(current()/points/*)]) + 1" />
当两个或更多车手的积分相同时,就会看到差异。
The second one is perfect, but I don't understand how it works. Can you explain it?
统计比当前积分多的车手数。
如果驱动排在首位,则没有驱动 有更多的点 - 结果是 0(我们加 1 ==> 1st);
如果车手排在第二位,那么有一个车手的积分更多-所以结果是1(我们加1==>第二);
如果有两位车手排在第二位,那么对于他们两人来说,恰好有一位车手的积分更多——所以他们都排在第二位;下一位车手前面有三位车手,所以他最终排在第 4 位 - 没有人被标记为第 3 位。
请注意,您可以先将点的总和存储在一个变量中,然后在 table 的两个位置使用该变量,例如:
<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>
不幸的是,无法避免为排序单独计算相同的东西。