在下面的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>
答案 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 < $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 < 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 < 10">0</xsl:if>
<xsl:value-of select="concat($nMonth, '-')" />
<xsl:if test="$nDate < 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