Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Imesh DamithОтветов: 3

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

javajavascriptxsltxalan

Ответы

Ответ 1 · рейтинг 1 · Martin Honnen

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

Ответ 2 · рейтинг 1 · imesh

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

Смотри ниже

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

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

}]]>
</xalan:script>

Ответ 3 · Imesh Damith

Я смог правильно разобрать 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">

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы