Java 从XSLT2.0降级后如何在xslt1.0中编写函数
我有xslt2.0,我将其降级为1.0,并使用xalan,但得到以下异常 可恢复错误:第9行:不支持的XSL元素“函数”。 xslt的部分如下所示Java 从XSLT2.0降级后如何在xslt1.0中编写函数,java,xslt-1.0,xalan,Java,Xslt 1.0,Xalan,我有xslt2.0,我将其降级为1.0,并使用xalan,但得到以下异常 可恢复错误:第9行:不支持的XSL元素“函数”。 xslt的部分如下所示 <xsl:function name="nav:adjustDate"> <xsl:param name="dateStr" /> <xsl:param name="age" /> <xsl:variable name="minu
<xsl:function name="nav:adjustDate">
<xsl:param name="dateStr" />
<xsl:param name="age" />
<xsl:variable name="minutes">
<xsl:choose>
<xsl:when test="$age = 1">
<xsl:value-of select="0" />
</xsl:when>
<xsl:when test="$age = 2">
<xsl:value-of select="-10" />
</xsl:when>
<xsl:when test="$age = 3">
<xsl:value-of select="-20" />
</xsl:when>
<xsl:when test="$age = 4">
<xsl:value-of select="-30" />
</xsl:when>
<xsl:when test="$age = 5">
<xsl:value-of select="-40" />
</xsl:when>
<xsl:when test="$age = 6">
<xsl:value-of select="-50" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="-60" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="dateFormatterStr">
<xsl:text>yyyy-MM-dd'T'HH:mm:ss.SSSZ</xsl:text>
</xsl:variable>
<!-- output date format should match the input date format of the job file -->
<xsl:variable name="outDateFormatterStr">
<xsl:text>yyyy-MM-dd'T'HH:mm:ssZ</xsl:text>
</xsl:variable>
<xsl:variable name="bo" select="bool:new('FALSE')" />
<xsl:variable name="dateFormatter" select="dateFormat:new($dateFormatterStr)" />
<xsl:variable name="outDateFormatter" select="dateFormat:new($outDateFormatterStr)" />
<xsl:value-of select="dateFormat:setLenient($dateFormatter,$bo)" />
<!-- Have to remove the colon in the timezone offset(eg. +05:00) otherwise date formatter wont work correctly -->
<xsl:variable name="testDate"
select="dateFormat:parse($dateFormatter,concat(substring($dateStr,1,string-length($dateStr)-3),'00'))" />
<xsl:variable name="cal" select="gregorianCal:new()" />
<xsl:value-of select="gregorianCal:setTime($cal,$testDate)" />
<!-- xslt version 2 does not accept contants 12 represents the value for java.util.Calendar.MINUTE
Follow section of code will subtract the number of minutes-->
<xsl:value-of select="gregorianCal:add($cal,12,$minutes)" />
<xsl:variable name="outputDate" select="gregorianCal:getTime($cal)" />
<xsl:sequence select="dateFormat:format($outDateFormatter,$outputDate)" />
</xsl:function>
yyyy-MM-dd'HH:MM:ss.SSSZ
yyyy-MM-dd'HH:MM:ssZ
还想知道xslt1.0中xsl:sequence的替代品
有人能在这方面指导我吗?如何进行?
我对xslt非常陌生。如果您对xslt非常陌生,那么将样式表从xslt 2.0向后移植到xslt 1.0可能是一个非常痛苦的经历。祝你好运 在XSLT1.0中,命名模板通常可以在XSLT2.0中使用函数的地方使用。您需要将外部xsl:function指令更改为xsl:template,然后需要更改所有调用者,以通过调用命名模板而不是调用函数来设置变量。最后,您需要将函数体转换为XSLT1.0。从调用其他用户声明函数初始化的大量变量来看,这将是一个非常缓慢的过程
如果您的目标(或分配给您此任务的人的目标)是提供一个对样式表进行长时间、密集的逐行研究的机会,那么这可能是一个好方法。否则,如果我是你,我建议重新考虑降级到1.0的决定。如果你对XSLT非常陌生,那么将样式表从XSLT 2.0向后移植到XSLT 1.0可能是一次非常痛苦的经历。祝你好运 在XSLT1.0中,命名模板通常可以在XSLT2.0中使用函数的地方使用。您需要将外部xsl:function指令更改为xsl:template,然后需要更改所有调用者,以通过调用命名模板而不是调用函数来设置变量。最后,您需要将函数体转换为XSLT1.0。从调用其他用户声明函数初始化的大量变量来看,这将是一个非常缓慢的过程 如果您的目标(或分配给您此任务的人的目标)是提供一个对样式表进行长时间、密集的逐行研究的机会,那么这可能是一个好方法。否则,如果我是你,我建议重新考虑降级到1.0的决定