Java脚本XSLT错误:对于扩展函数,找不到方法Java.lang.String。([ExpressionContext,]字符串)

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"

您好,我正在使用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" 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>