Как включить вызов JavaScript в XSLT?

Я пытаюсь вызвать JavaScript внутри XSLT, но он продолжает терпеть неудачу. Я использую пространство имен Xalan. Я также вызываю Java, и это работает без проблем, но по какой-то причине JavaScript не работает.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xalan/java" xmlns:xalan="http://xml.apache.org/xalan" xmlns:counter="MyCounter" extension-element-prefixes="counter">
<xsl:template match="/">
    <xalan:component prefix="counter" functions="response">
        <xalan:script lang="javascript">

          function response(name) {
            // Return a string.
            return "" + (name);
          }

        </xalan:script>
     </xalan:component>

    <xsl:value-of select="counter:response('hello')"/> 
    <xsl:variable name="rightNow" select="java:java.util.Date.new()"/><!-- Get date object -->
    <xsl:variable name="formatter" select="java:java.text.SimpleDateFormat.new('MM')"/> <!-- double digit format: append 0 to less than ten -->  
    <xsl:variable name="formattedMonth" select="java:format($formatter, $rightNow)"/> <!-- format it -->
    <p><xsl:value-of select="$formattedMonth"/></p> 
</xsl:template> 
</xsl:stylesheet> 

Я получаю эту ошибку в преобразователе XML:

<Location of error unknown>java.lang.NoSuchMethodException: For extension function, could not find method java.lang.String.response<ExpressionContext, ]>.

person Johnathan Au    schedule 18.09.2013    source источник
comment
Я думаю, тега script достаточно, он, вероятно, не требует префикса xalan <script type="text/javascript">   -  person Ashok    schedule 18.09.2013
comment
Разве у вас не должно быть functions="response" в элементе xalan:component?   -  person JLRishe    schedule 18.09.2013


Ответы (1)


  1. Следуйте инструкциям Apache по расширению Xalan-Java JavaScript, особенно внимательно чтобы включить js.jar и bsf.jar в путь к классам. (Важно, но, вероятно, это не ваша проблема, иначе вы бы увидели полезные трассировки стека.)
  2. См. также этот связанный вопрос SO . (Полезно, но вы, наверное, уже видели.)
  3. Как упоминал @JLRishe, добавьте functions="response" к xalan:component. (Правильно, но кажется, что это не является строго необходимым, по крайней мере, в данном случае.)
  4. Переместите xalan:component из xsl:template. (Критично. Вероятно, здесь проблема.)

Итак, запустив измененный таким образом код:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:java="http://xml.apache.org/xalan/java"
                xmlns:xalan="http://xml.apache.org/xalan"
                xmlns:counter="MyCounter"
                extension-element-prefixes="counter">

  <xalan:component prefix="counter" functions="response">
    <xalan:script lang="javascript">

      function response(name) {
        // Return a string.
        return "" + (name);
      }

    </xalan:script>
  </xalan:component>

  <xsl:template match="/">
    <xsl:value-of select="counter:response('hello')"/> 
    <xsl:variable name="rightNow" select="java:java.util.Date.new()"/><!-- Get date object -->
    <xsl:variable name="formatter" select="java:java.text.SimpleDateFormat.new('MM')"/> <!-- double digit format: append 0 to less than ten -->  
    <xsl:variable name="formattedMonth" select="java:format($formatter, $rightNow)"/> <!-- format it -->
    <p><xsl:value-of select="$formattedMonth"/></p> 
  </xsl:template> 
</xsl:stylesheet>

Выдает следующий результат, как и ожидалось:

<?xml version="1.0" encoding="UTF-8"?>hello<p xmlns:xalan="http://xml.apache.org/xalan" xmlns:java="http://xml.apache.org/xalan/java">09</p>
person kjhughes    schedule 18.09.2013