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-basicによるとxalan:script、クラスパスにbsf.jarとjs.jarを配置すると、XalanJavaは要素をサポートします。

于 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を使わなければなりませんでした。bsfjarはxalanに付属していないため。bsf-2.4.0また、xalanjarを個別に使用する必要があったことを伝えたいと思います。Java1.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" Exclusive-result-prefixes = "ttVB" version = "1.0"

そして、http://xml.apache.org/xalan-j/extensions.html#ex-basicに従ったJavascript宣言

xalan:component prefix = "ttVB" Functions = "FctDateDuration">

xalan:script lang = "javascript">

于 2011-01-13T11:30:01.283 に答える