1

嗨,我正在使用 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>
4

3 回答 3

1

那么扩展函数很难移植,甚至它们的定义方式也不能移植。使用 .NET,您可以使用该msxsl:script元素来定义扩展功能,但不要指望 Xalan 支持它。根据http://xml.apache.org/xalan-j/extensions.html#ex-basicxalan:script如果您将 bsf.jar 和 js.jar 放在类路径上,Xalan Java 支持元素。

于 2011-01-12T12:53:12.497 回答
1

您应该将 java 脚本部分标记为 CDATA。

见下文

<xalan:component prefix="ttVB" functions="FctDateDuration">
<xalan:script lang="javascript">

<![CDATA[
function FctDateDuration(p_startDate,p_endDate){
    //alert("inside");
.
.

}]]>
</xalan:script>

于 2012-04-19T07:02:18.080 回答
0

我能够正确解析 xsl。感谢马丁您提供的帮助。我想把我所做的更改放在这里。所以它会对其他人有所帮助。

我不得不使用 bsf.jar 和 js.jar。由于 bsf jar 没有随 xalan 一起提供。bsf-2.4.0 另外我想告诉你我必须单独使用 xalan jars。Java 1.5 内置 xalan 给了我错误。

我更改了 xsl 声明 sl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" xmlns:ttVB= "ext1" 扩展元素前缀="ttVB" 排除结果前缀="ttVB" 版本="1.0"

以及根据http://xml.apache.org/xalan-j/extensions.html#ex-basic的 Javascript 声明

xalan:组件前缀="ttVB" 函数="FctDateDuration">

xalan:script lang="javascript">

于 2011-01-13T11:30:01.283 回答