2011-01-12 16 views
1

嗨,我使用Xalan來解析我的xsl文件。 xsl在vb.net解析器中正常工作。但是Xalan給出了那個xsl的錯誤。Java腳本XSLT錯誤:對於擴展功能,找不到方法java.lang.String。 ([ExpressionContext,] #STRING)

對於擴展函數,找不到 方法 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> 

回答

1

阱擴展功能是很難便攜,甚至沒有它們被定義的方式是便攜式的。使用.NET,您可以使用msxsl:script元素來定義擴展函數,但不要期望Xalan支持該功能。根據http://xml.apache.org/xalan-j/extensions.html#ex-basic如果將bsf.jar和js.jar放在類路徑中,則Xalan Java支持xalan:script元素。

+0

+1見鏈接。但答案很混亂。你的意思是什麼?「擴展功能很難移植」*?只要您遵循XSLT標準機制,您就可以將一個XSLT處理器的擴展函數移植到其他XSLT處理器,而無需更改樣式表。作爲標準規範的一部分的擴展機制是XSLT的一個特性! – 2011-01-12 21:33:51

0

我能夠正確解析xsl。感謝Martin給予的幫助。 我想把這裏所做的改變放在這裏。所以這會對其他人有所幫助。我不得不使用bsf.jar和js.jar。由於bsf jar不附帶xalan。 bsf-2.4.0 另外我想告訴我必須分開使用xalan罐。 Java 1.5內置xalan給了我錯誤。

我改變了xsl decleration SL:樣式的xmlns:XSL = 「http://www.w3.org/1999/XSL/Transform」 的xmlns:xalan的=「http://xml.apache.org/Xalan的」的xmlns:ttVB = 「EXT1」 伸長元件前綴= 「ttVB」 排除-結果前綴= 「ttVB」 版本= 「1.0」

和JavaScript聲明根據http://xml.apache.org/xalan-j/extensions.html#ex-basic

xalan:組件前綴=「ttVB」功能=「FctDateDuration」>

x alan:腳本lang =「javascript」>

1

您應該將java腳本部分標記爲CDATA。

下面

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

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

}]]> 
</xalan:script>