我正在尝试显示静态信息或使用表格格式的函数计算。
基本上我有几个比赛的球队统计数据,如果有主队和客队,只有状态为“比赛”的比赛应该计入分数,但我需要在排名表中显示它们他们的胜利。
这是XML
<Schedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Teams>
<Team>Blue Jays</Team>
</Teams>
<Game>
<Home_Team>Blue Jays</Home_Team>
<Away_Team>Marlins</Away_Team>
<Date>2012-01-10</Date>
<Home_Team_Score>7</Home_Team_Score>
<Away_Team_Score>9</Away_Team_Score>
</Game>
这是我试图显示表格的XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0"/>
<xsl:key name="team" match="Teams" use="Team"/>
<xsl:template match="/Schedule">
<html>
<head>
<title><xsl:value-of select="League"/>
</title>
<link href="batty.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<xsl:apply-templates select="headliner"/>
</body>
</html>
</xsl:template>
<xsl:template match="headliner">
<h1>
<xsl:value-of select="League"/>
</h1>
<h5>
<th>put date here</th>
</h5>
<xsl:apply-templates select="scoreboard"/>
</xsl:template>
<xsl:template match="scoreboard">
<table cellspacing="1" cellpadding="2" id="scores">
<tr class="title">
<th colspan="22">Season <xsl:value-of select="//Schedule[@season]"/></th>
</tr>
<tr class="fields">
<th style="text-align: left">Team</th>
<th>Rank</th>
<th>Wins</th>
<th>Losses</th>
<th>Ties</th>
<th>Points Earned</th>
<th>Points Against</th>
<th>Win %</th>
<th>Games Behind</th>
</tr>
<tr class="rankingTeams">
<xsl:call-template name="calcScores">
</xsl:call-template>
</tr>
</table>
</xsl:template>
<xsl:template name="calcScores">
<xsl:variable name="wins" />
<xsl:variable name="losses" />
<xsl:variable name="ties" />
<xsl:variable name="pointsEarned" />
<xsl:variable name="winPercentage" />
<xsl:variable name="gamesBehind" />
<xsl:for-each
select="//Teams[generate-id()=generate-id(key('team', Team)[1])]">
<xsl:sort select="Team" />
<h1><xsl:value-of select="Team" /></h1>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我在桌子上遇到麻烦甚至显示。我可以将记分板模板中的代码直接放在正文中,它会显示,但不会显示调用模板时的方式。
然后我不知道如何计算我的for-each循环中的输赢等等
答案 0 :(得分:1)
在我看来,好像你在这里混淆了“模板匹配”和“模板名称”。您正在匹配源代码中不存在的元素标题和记分板,但您想要做的似乎是将它们用作被调用的模板。我想您应该阅读如何在XSLT中使用模板以及匹配和名称模板之间的区别......
同样很奇怪的是,当你调用calcscores时,应该怎么办?目前,这将为每个团队产生一个h1元素,在一个tr ...内部似乎没有意义,我想你想为每个团队生成一个 tr 。
试试这个,也许这会帮助你开始:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0"/>
<xsl:key name="team" match="Teams" use="Team"/>
<xsl:template match="/Schedule">
<html>
<head>
<title>
<xsl:value-of select="League"/>
</title>
<link href="batty.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<xsl:call-template name="headliner"/>
<xsl:call-template name="scoreboard"/>
</body>
</html>
</xsl:template>
<xsl:template name="headliner">
<h1>
<xsl:value-of select="League"/>
</h1>
<h5>
<th>put date here</th>
</h5>
<xsl:apply-templates select="scoreboard"/>
</xsl:template>
<xsl:template name="scoreboard">
<table cellspacing="1" cellpadding="2" id="scores">
<tr class="title">
<th colspan="22">Season <xsl:value-of select="//Schedule/@season"/></th>
</tr>
<tr class="fields">
<th style="text-align: left">Team</th>
<th>Rank</th>
<th>Wins</th>
<th>Losses</th>
<th>Ties</th>
<th>Points Earned</th>
<th>Points Against</th>
<th>Win %</th>
<th>Games Behind</th>
</tr>
<xsl:apply-templates select="//Teams">
<xsl:sort select="Team"/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="Team">
<tr class="rankingTeams">
<td style="text-align: left">
<xsl:value-of select="."/>
</td>
<td><!-- Rank: no idea how you want to calculate this --></td>
<td>
<!-- Wins -->
<xsl:variable name="homeWins"
select="count(//Game[Home_Team=current()][Home_Team_Score > Away_Team_Score])"
/>
<xsl:variable name="awayWins"
select="count(//Game[Away_Team=current()][Away_Team_Score > Home_Team_Score])"
/>
<xsl:value-of select="$homeWins + $awayWins"/>
</td>
<td><!-- Loses: similar to Wins --></td>
<td><!-- Ties: similar to Wins --></td>
<td><!-- Points Earned --></td>
<td><!-- Points Against --></td>
<td><!-- Win % --></td>
<td><!-- Games Behind --></td>
</tr>
</xsl:template>
</xsl:stylesheet>