Xpath 2.0表达式中的调试错误

时间:2014-07-04 12:45:32

标签: xslt xslt-1.0

在下面的XSLt代码中出现问题,即使定义了变量,它也会显示未定义的变量。

首先选择的是测试年份是闰年还是非闰年。 第二个选择仅查找月份天数的案例。

<xsl:template name="CalDateNTime">
<xsl:param name="pDate"/>
<xsl:param name="pMonth"/> 
<xsl:param name="pYear"/>
<xsl:choose>
            <!--    Leap Year  -->  

    <xsl:when test="($pYear mod 4=0 and $pYear mod 100 !=0) or $pYear mod 400 =0" >

<xsl:value-of select="$pDate"/>
<xsl:value-of select="$rDate"/>
<xsl:value-of select="$pMonth"/>

    <xsl:choose>

        <xsl:when test="$pMonth=1 and $rDate=32">
        <xsl:variable name="rDate" select="1"/>
        <xsl:variable name="rMonth" select="2"/>
        </xsl:when>

        <xsl:when test="$pMonth=2 and $rDate=30">
        <xsl:variable name="rDate" select="1"/>
        <xsl:variable name="rMonth" select="3"/>
        </xsl:when>

        <xsl:when test="$pMonth=3 and $rDate=32">
        <xsl:variable name="rDate" select="1"/>
        <xsl:variable name="rMonth" select="4"/>
        </xsl:when>

    </xsl:choose>

    </xsl:when>

          <!--  Non - Leap Year  -->    
    <xsl:otherwise>
    <xsl:variable name="jan" select="31"/>
    <xsl:variable name="feb" select="28"/>
    </xsl:otherwise>
</xsl:choose>
</xsl:template> 

1 个答案:

答案 0 :(得分:1)

XSLT变量仅存在于其父级中。

<xsl:when test="$pMonth=1 and $rDate=32">
  <xsl:variable name="rDate" select="1" />
  <xsl:variable name="rMonth" select="2" />
</xsl:when>

这两个变量超出范围立即(在</xsl:when>)。

您必须以不同方式构建程序。将<xsl:choose> 放入变量。

我只能假设你的部分示例代码应该做什么。我的假设是:它应该计算给定日期之后的那一天。

这是另一种实现方式:

<xsl:template name="CalDateNTime">
  <xsl:param name="pDate" />
  <xsl:param name="pMonth" /> 
  <xsl:param name="pYear" />

  <xsl:variable name="dayNum" select="'312831303130313130313031'" />
  <xsl:variable name="isLeap" select="($pYear mod 4 = 0 and $pYear mod 100 != 0) or ($pYear mod 400 = 0)" />

  <!-- determine index into the $dayNum string -->
  <xsl:variable name="idx" select="($pMonth - 1) * 2" />
  <xsl:variable name="maxDate" select="substring($dayNum, $idx + 1, 2)" />
  <xsl:variable name="isSameMonth" select="($pDate &lt; $maxDate) or ($pDate = $maxDate and $pMonth = 2 and $isLeap)" />

  <!-- calculate following day, month, year values -->
  <xsl:variable name="nDate">
    <xsl:choose>
      <xsl:when test="$isSameMonth"><xsl:value-of select="$pDate + 1" /></xsl:when>
      <xsl:otherwise>1</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="nMonth">
    <xsl:choose>
      <xsl:when test="$isSameMonth"><xsl:value-of select="$pMonth" /></xsl:when>
      <xsl:when test="$pMonth &lt; 12"><xsl:value-of select="$pMonth + 1" /></xsl:when>
      <xsl:otherwise>1</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="nYear">
    <xsl:choose>
      <xsl:when test="not($isSameMonth) and $nMonth = 1"><xsl:value-of select="$pYear + 1" /></xsl:when>
      <xsl:otherwise><xsl:value-of select="$pYear" /></xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <!-- build output string -->
  <xsl:value-of select="concat($nYear, '-')" />
  <xsl:if test="$nMonth &lt; 10">0</xsl:if>
  <xsl:value-of select="concat($nMonth, '-')" />
  <xsl:if test="$nDate &lt; 10">0</xsl:if>
  <xsl:value-of select="$nDate" />
</xsl:template>

用法

<xsl:call-template name="CalDateNTime">
  <xsl:with-param name="pDate" select="28" />
  <xsl:with-param name="pMonth" select="2" /> 
  <xsl:with-param name="pYear" select="2000" />
</xsl:call-template>   

结果

2000-02-29