HI,我正在使用Xalan来解析我的xsl文件。 xsl在vb.net解析器中正常工作。但是Xalan给出了xsl的错误。
对于扩展功能,找不到 方法 java.lang.String.FctDateDuration([ExpressionContext,] STRING)。
以下是我定义xsl的方法。
xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:ttVB="ttVB" exclude-result
以下是xsl中的java脚本调用部分: -
<xsl:variable name="start">
xsl:value-of select="substring(DepartureDateTime,1,10)" />
</xsl:variable>
xsl:variable name="end">
xsl:value-of select="substring(following-sibling::OriginDestinationInformation/DepartureDateTime,1,10)" />
</xsl:variable>
xsl:variable name="end1">
xsl:value-of select="substring(preceding-sibling::OriginDestinationInformation/DepartureDateTime,1,10)" />
</xsl:variable>
xsl:variable name="dd" select="ttVB:FctDateDuration(string('2011-02-20'),string('2011-02-25'))"/>
xsl:variable name="dd1" select="ttVB:FctDateDuration(string('2011-02-20'),string('2011-02-25'))"/>
<xsl:choose>
xsl:when test="$dd = 0 or $dd = 1">
<timeQualifier>TA</timeQualifier>
</xsl:when>
xsl:otherwise>
timeQualifier>TD</timeQualifier>
</xsl:otherwise>
</xsl:choose>
这是我的Javascript
<msxsl:script language="JavaScript" implements-prefix="ttVB">
<![CDATA[
function FctDateDuration(p_startDate,p_endDate){
if (IsDate(p_startDate) && IsDate(p_endDate)){
FctDateDuration = String(calcDays(p_startDate, p_endDate))
}else{
FctDateDuration = p_startDate + p_endDate
}
return FctDateDuration;
}
function IsDate(ddate){
//alert("Inside IsDate >> "+ddate);
var dteDate;
var year = ddate.substring(0, 4);
var month = ddate.substring(5, 7);
var day = ddate.substring(8,10);
month = month-1;
//alert(year);
//alert(month);
//alert(day);
dteDate=new Date(year,month,day);
return ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear()));
}
function calcDays(date1,date2){
date1 = date1.split("-");
date2 = date2.split("-");
var sDate = new Date(date1[0]+"/"+date1[1]+"/"+date1[2]);
var eDate = new Date(date2[0]+"/"+date2[1]+"/"+date2[2]);
var daysApart = Math.abs(Math.round((sDate-eDate)/86400000));
//document.getElementById('diffDays').lastChild.data = daysApart;
//alert(daysApart);
return daysApart;
}
]]>
</msxsl:script>
答案 0 :(得分:1)
扩展功能很难移植,即使它们被定义的方式也是可移植的。使用.NET,您可以使用msxsl:script
元素来定义扩展函数,但不要指望Xalan支持它。根据{{3}} Xalan Java支持xalan:script
元素,如果你将bsf.jar和js.jar放在类路径上。
答案 1 :(得分:1)
您应该将java脚本部分标记为CDATA。
见下文
<xalan:component prefix="ttVB" functions="FctDateDuration">
<xalan:script lang="javascript">
<![CDATA[
function FctDateDuration(p_startDate,p_endDate){
//alert("inside");
.
.
}]]>
</xalan:script>
答案 2 :(得分:0)
我能够正确解析xsl。感谢Martin给你的帮助。 我想把我所做的改变放在这里。所以它对别人有帮助。
我不得不使用bsf.jar和js.jar。由于bsf jar不附带xalan。 BSF-2.4.0 另外我想告诉我必须单独使用xalan罐子。 Java 1.5内置的xalan给了我错误。
我更改了xsl decleration sl:stylesheet xmlns:xsl =“http://www.w3.org/1999/XSL/Transform”xmlns:xalan =“http://xml.apache.org/xalan”xmlns:ttVB =“ext1”extension- element-prefixes =“ttVB”exclude-result-prefixes =“ttVB”version =“1.0”
根据http://xml.apache.org/xalan-j/extensions.html#ex-basic
的Javascript声明xalan:component prefix =“ttVB”functions =“FctDateDuration”&gt;
xalan:script lang =“javascript”&gt;