Java脚本XSLT错误:对于扩展函数,找不到方法Java.lang.String。([ExpressionContext,]字符串)
您好,我正在使用Xalan解析我的xsl文件。xsl在vb.net解析器中正常工作。但Xalan给出了该xsl的错误 对于扩展函数,找不到 方法 java.lang.String.FctDateDuration[ExpressionContext,] 绳子 下面是我如何定义xsl的Java脚本XSLT错误:对于扩展函数,找不到方法Java.lang.String。([ExpressionContext,]字符串),java,javascript,xslt,xalan,Java,Javascript,Xslt,Xalan,您好,我正在使用Xalan解析我的xsl文件。xsl在vb.net解析器中正常工作。但Xalan给出了该xsl的错误 对于扩展函数,找不到 方法 java.lang.String.FctDateDuration[ExpressionContext,] 绳子 下面是我如何定义xsl的 xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
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脚本调用部分:-
这是我的Javascript
扩展函数很难移植,甚至它们的定义方式也不可移植。在.NET中,您可以使用msxsl:script元素来定义扩展函数,但不要指望Xalan支持。根据Xalan,如果将bsf.jar和js.jar放在类路径上,Java支持Xalan:script元素。我能够正确解析xsl。谢谢马丁对你的帮助。 我想把我所做的更改放在这里。所以这对其他人有帮助 我不得不使用bsf.jar和js.jar。因为bsf jar没有随xalan一起提供。bsf-2.4.0 我还想告诉大家,我必须单独使用xalan罐子。Java1.5内置xalan给了我错误 我更改了xsl的删除 sl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform xalan=http://xml.apache.org/xalan xmlns:ttVB=ext1扩展元素前缀=ttVB排除结果前缀=ttVB版本=1.0 和Javascript声明 xalan:component prefix=ttVB functions=FctDateDuration>
xalan:script lang=javascript>您应该将java脚本部分标记为CDATA 见下文
<xalan:component prefix="ttVB" functions="FctDateDuration">
<xalan:script lang="javascript">
<![CDATA[
function FctDateDuration(p_startDate,p_endDate){
//alert("inside");
.
.
}]]>
</xalan:script>
+1用于链接。但答案是困惑。你所说的扩展功能很难移植是什么意思?只要遵循XSLT标准机制,就可以将一个XSLT处理器的扩展函数移植到另一个XSLT处理器,而无需更改样式表。作为标准规范的一部分的扩展机制是XSLT的一个特性!Alejandro,用JScript for MSXML编写的扩展函数不一定可以作为JavaScript for Xalan编写的扩展函数移植,甚至不一定可以作为JScript.NET中编写的用于Micorosft的XslCompiledTransform的扩展函数移植。使用扩展函数从XSLT获取节点集,对其进行操作并将节点集返回给XSLT。您可能可以在表面上为所有三个XSLT处理器使用JavaScript,但XSLT节点集的脚本公开的数据类型和API通常不相同。我的意思是,您的回答没有澄清这不是扩展函数的问题,而是用于embbed扩展的非标准扩展元素的问题函数声明不是XSLT模型。
<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>
<xalan:component prefix="ttVB" functions="FctDateDuration">
<xalan:script lang="javascript">
<![CDATA[
function FctDateDuration(p_startDate,p_endDate){
//alert("inside");
.
.
}]]>
</xalan:script>