找到上下文节点,它应该是什么值

时间:2014-01-22 20:51:28

标签: xml xslt

我正在尝试使用我创建的模板,现在正调用另一个模板。

使用上下文的值调用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 &lt; @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 &lt; 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 &lt;= 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>

1 个答案:

答案 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 &lt; $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 &lt; $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 &lt;= 9])" />

这是一个绝对的表达方式,所以所有轮次都会加分,而不仅仅是本轮。表达式应该如下所示,它将找到当前父元素的所有得分元素。

<xsl:value-of select="sum(../score[@holeNumber &lt;= 9])" />

另请注意,检查孔号是9还是18的 xsl:choose 应该是以下之一

<xsl:when test="@holeNumber=18" >

or

<xsl:when test="$holeNum=18" >

(变量 holeNum 设置为属性 holeNumber 的值,因此两者都相同)

尝试修复所有这些问题,看看你是如何进行的......