无法通过表中的XSL显示XML信息

时间:2014-02-06 23:35:46

标签: xml xslt

我正在尝试显示静态信息或使用表格格式的函数计算。

基本上我有几个比赛的球队统计数据,如果有主队和客队,只有状态为“比赛”的比赛应该计入分数,但我需要在排名表中显示它们他们的胜利。

这是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循环中的输赢等等

1 个答案:

答案 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 &gt; Away_Team_Score])"
            />
            <xsl:variable name="awayWins"
                select="count(//Game[Away_Team=current()][Away_Team_Score &gt; 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>