Java-скрипт XSLT Ошибка: для функции расширения не удалось найти метод java.lang.String. ([Контекст выражения,] #STRING)

Привет, я использую 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

Вот часть вызова java-скрипта в xsl: -

<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>

person Imesh Damith    schedule 12.01.2011    source источник


Ответы (3)


Ну, функции расширения вряд ли переносимы, даже то, как они определены, не является переносимым. В .NET вы можете использовать элемент msxsl:script для определения функций расширения, но не ожидайте, что Xalan это поддержит. Согласно http://xml.apache.org/xalan-j/extensions.html#ex-basic Xalan Java поддерживает элемент xalan:script, если вы поместите bsf.jar и js.jar в путь к классам.

person Martin Honnen    schedule 12.01.2011
comment
+1 за ссылку. Но ответ сбивает с толку. Что вы подразумеваете под функциями расширения трудно переносимыми? Если вы следуете стандартному механизму XSLT, вы можете портировать функцию расширения для одного процессора XSLT на другой без необходимости изменения таблицы стилей. Механизм расширения как часть стандартной спецификации является особенностью XSLT! - person ; 13.01.2011
comment
Алехандро, функция расширения, написанная на JScript для MSXML, не обязательно является переносимой, как функция расширения, написанная на JavaScript для Xalan, или даже переносимая как функция расширения, написанная на JScript.NET для XslCompiledTransform от Micorosft. Используйте функцию расширения, которая берет набор узлов из XSLT, обрабатывает его и возвращает набор узлов в XSLT. Возможно, вы сможете использовать J(ava)Script на поверхности для всех трех процессоров XSLT, но тип данных и API, предоставляемые сценарию для набора узлов XSLT, обычно не совпадают. - person Martin Honnen; 13.01.2011
comment
Я говорю, что ваш ответ не разъясняет, что это не проблема с функцией расширения, а проблема с нестандартными элементами расширения, используемыми для объявлений встроенных функций расширения, которые не являются XSLT модель. - person ; 13.01.2011

Вы должны пометить раздел java script как CDATA.

Смотри ниже

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

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

}]]>
</xalan:script>

person imesh    schedule 19.04.2012

Я смог правильно разобрать xsl. Спасибо Мартину за помощь, которую вы оказали. Я хотел бы разместить здесь изменения, которые я сделал. Так что это поможет другим.

Мне пришлось использовать bsf.jar и js.jar. Так как bsf jar не поставляется с ксаланом. bsf-2.4.0 Также я хотел бы сказать, что мне пришлось использовать ксалановые банки отдельно. Встроенный xalan в Java 1.5 дал мне ошибки.

Я изменил декларацию xsl 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" exclude-result-prefixes="ttVB" version="1.0"

И объявление Javascript в соответствии с http://xml.apache.org/xalan-j/extensions.html#ex-basic

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

ксалан: скрипт lang="javascript">

person Imesh Damith    schedule 13.01.2011