我正在尝试使用我创建的模板,现在正调用另一个模板。
使用上下文的值调用formatHole模板 holeScore参数的节点,parScore参数的值使用值 其holeNumber属性等于holeNum变量的par元素。
这是formatHole模板
<xsl:template name="formatHole">
<xsl:param name="parScore" />
<xsl:param name="holeScore" />
<xsl:choose>
<xsl:when test="@holeScore < @parScore" >
<td class="low"><xsl:value-of select="@holeScore" /></td>
</xsl:when>
<xsl:when test="@holeScore > @parScore" >
<td class="high"><xsl:value-of select="@holeScore" /></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="@holeScore" /></td>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
然后,这里是调用formatHole模板的分数模板
<xsl:template match="score">
<!-- <xsl:variable name="holeScore" select="." /> -->
<xsl:variable name="holeNum" select="@holeNumber" />
<xsl:call-template name="formatHole">
<xsl:with-param name="holeScore" select="context()" />
<xsl:with-param name="parScore" select="tournament/course/par[@holeNumber = $holeNum]" />
</xsl:call-template>
<tr>
<td><xsl:value-of select="@holeNumber"/></td>
<xsl:choose>
<xsl:when test="@holeNum=18" >
<td class="sub"><xsl:value-of select="sum(//score[@holeNumber > 9 and @holeNumber < 18])" /></td>
<td class="final"><xsl:value-of select="sum(//score[@holeNumber])" /></td>
</xsl:when>
<xsl:when test="@holeNum=9">
<td class="sub"><xsl:value-of select="sum(//score[@holeNumber <= 9])" /></td>
</xsl:when>
</xsl:choose>
</tr>
</xsl:template>
分数不会像他们应该的那样出现,只有其他每一个洞都有值。
XML看起来像这样
<name>Westfield Open</name>
<date>5/28/2008 - 5/31/2008</date>
<location>Westfield Golf Club</location>
<course>
<par holeNumber="1">4</par>
<par holeNumber="2">4</par>
<par holeNumber="3">5</par>
<par holeNumber="4">3</par>
<par holeNumber="5">4</par>
<par holeNumber="6">4</par>
<par holeNumber="7">5</par>
<par holeNumber="8">3</par>
<par holeNumber="9">4</par>
<par holeNumber="10">4</par>
<par holeNumber="11">5</par>
<par holeNumber="12">4</par>
<par holeNumber="13">3</par>
<par holeNumber="14">4</par>
<par holeNumber="15">5</par>
<par holeNumber="16">4</par>
<par holeNumber="17">3</par>
<par holeNumber="18">4</par>
</course>
<golfer>
<name>Brett Bierson</name>
<round roundNumber="1">
<score holeNumber="1">4</score>
<score holeNumber="2">4</score>
<score holeNumber="3">5</score>
<score holeNumber="4">2</score>
<score holeNumber="5">4</score>
<score holeNumber="6">4</score>
<score holeNumber="7">5</score>
<score holeNumber="8">4</score>
<score holeNumber="9">4</score>
<score holeNumber="10">4</score>
<score holeNumber="11">3</score>
<score holeNumber="12">4</score>
<score holeNumber="13">3</score>
<score holeNumber="14">4</score>
<score holeNumber="15">5</score>
<score holeNumber="16">5</score>
<score holeNumber="17">3</score>
<score holeNumber="18">3</score>
</round>
<round roundNumber="2">
<score holeNumber="1">3</score>
<score holeNumber="2">4</score>
<score holeNumber="3">5</score>
<score holeNumber="4">3</score>
<score holeNumber="5">4</score>
<score holeNumber="6">4</score>
<score holeNumber="7">5</score>
<score holeNumber="8">3</score>
<score holeNumber="9">4</score>
<score holeNumber="10">4</score>
<score holeNumber="11">4</score>
<score holeNumber="12">4</score>
<score holeNumber="13">3</score>
<score holeNumber="14">4</score>
<score holeNumber="15">6</score>
<score holeNumber="16">4</score>
<score holeNumber="17">4</score>
<score holeNumber="18">4</score>
</round>
<round roundNumber="3">
<score holeNumber="1">3</score>
<score holeNumber="2">4</score>
<score holeNumber="3">6</score>
<score holeNumber="4">3</score>
<score holeNumber="5">4</score>
<score holeNumber="6">4</score>
<score holeNumber="7">5</score>
<score holeNumber="8">2</score>
<score holeNumber="9">4</score>
<score holeNumber="10">4</score>
<score holeNumber="11">4</score>
<score holeNumber="12">3</score>
<score holeNumber="13">3</score>
<score holeNumber="14">5</score>
<score holeNumber="15">4</score>
<score holeNumber="16">4</score>
<score holeNumber="17">2</score>
<score holeNumber="18">4</score>
</round>
<round roundNumber="4">
<score holeNumber="1">4</score>
<score holeNumber="2">4</score>
<score holeNumber="3">5</score>
<score holeNumber="4">2</score>
<score holeNumber="5">3</score>
<score holeNumber="6">5</score>
<score holeNumber="7">5</score>
<score holeNumber="8">4</score>
<score holeNumber="9">3</score>
<score holeNumber="10">5</score>
<score holeNumber="11">5</score>
<score holeNumber="12">4</score>
<score holeNumber="13">6</score>
<score holeNumber="14">5</score>
<score holeNumber="15">5</score>
<score holeNumber="16">3</score>
<score holeNumber="17">3</score>
<score holeNumber="18">4</score>
</round>
</golfer>
</tournament>
答案 0 :(得分:2)
您的XSLT中存在许多问题。首先在您的命名模板 formatHole 中。您有两个参数, holeScore 和 parScore ,但要参考这些参数,您需要执行 $ holeScore ,而不是 @holeScore 。通过 @holeScore ,您正在寻找一个名为 holeScore 的属性,无论当前上下文节点是什么(在这种情况下仍然得分)。模板中的参数(和变量)使用 $ 符号进行引用。
模板应如下所示
<xsl:template name="formatHole">
<xsl:param name="parScore" />
<xsl:param name="holeScore" />
<xsl:choose>
<xsl:when test="$holeScore < $parScore" >
<td class="low"><xsl:value-of select="$holeScore" /></td>
</xsl:when>
<xsl:when test="$holeScore > $parScore" >
<td class="high"><xsl:value-of select="$holeScore" /></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="$holeScore" /></td>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
或者,也许,为了避免一些重复,像这样......
<xsl:template name="formatHole">
<xsl:param name="parScore" />
<xsl:param name="holeScore" />
<td>
<xsl:choose>
<xsl:when test="$holeScore < $parScore" >
<xsl:attribute name="class">low</xsl:attribute>
</xsl:when>
<xsl:when test="$holeScore > $parScore" >
<xsl:attribute name="class">high</xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:value-of select="$holeScore" />
</td>
</xsl:template>
其次(和第三),您如何调用模板存在问题
<xsl:call-template name="formatHole">
<xsl:with-param name="holeScore" select="context()" />
<xsl:with-param name="parScore" select="tournament/course/par[@holeNumber = $holeNum]" />
</xsl:call-template>
context()不是(据我所知)有效的关键字。它应该是当前()。
此外, parScore 的xpath将相对于当前的得分元素,因此您正在寻找名为锦标赛的子元素。真的,您应该从文档节点使用“绝对”路径。像这样:
<xsl:call-template name="formatHole">
<xsl:with-param name="holeScore" select="current()" />
<xsl:with-param name="parScore" select="/tournament/course/par[@holeNumber = $holeNum]" />
</xsl:call-template>
实际上,使用密钥查找标准分数可能更有效
<xsl:key name="par" match="course/par" use="@holeNumber" />
然后你可以这样做
<xsl:call-template name="formatHole">
<xsl:with-param name="holeScore" select="current()" />
<xsl:with-param name="parScore" select="key('par', $holeNum)" />
</xsl:call-template>
最后,您计算子和最终得分的方式存在问题
<xsl:value-of select="sum(//score[@holeNumber <= 9])" />
这是一个绝对的表达方式,所以所有轮次都会加分,而不仅仅是本轮。表达式应该如下所示,它将找到当前父元素的所有得分元素。
<xsl:value-of select="sum(../score[@holeNumber <= 9])" />
另请注意,检查孔号是9还是18的 xsl:choose 应该是以下之一
<xsl:when test="@holeNumber=18" >
or
<xsl:when test="$holeNum=18" >
(变量 holeNum 设置为属性 holeNumber 的值,因此两者都相同)
尝试修复所有这些问题,看看你是如何进行的......