【问题标题】:How to include a call to JavaScript within XSLT?如何在 XSLT 中包含对 JavaScript 的调用?
【发布时间】:2013-09-23 02:54:46
【问题描述】:

我试图在 XSLT 中调用 JavaScript,但它一直失败。我正在使用 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, ]>.

【问题讨论】:

  • 我觉得script标签就够了,可能不需要xalan前缀&lt;script type="text/javascript"&gt;
  • 你不应该在xalan:component元素中有functions="response"吗?

标签: javascript xslt xalan


【解决方案1】:
  1. 关注Apache's Xalan-Java JavaScript extension instructions,尤其要小心在类路径中包含 js.jarbsf.jar。 (很重要,但可能不是您的问题,否则您会看到有用的堆栈跟踪。
  2. 另见this related SO question。 (有用,但你可能已经看过了。
  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>

【讨论】:

  • 您好,感谢您的回答。一个不相关的问题,什么是 MyCounter 以及为什么在命名空间中声明它?这是来自 xalan 示例
  • XSLT 扩展机制利用了 XML 命名空间机制。 'MyCounter' 可能是此处给出的 JavaScript 扩展示例的残留物:xml.apache.org/xalan-j/extensions.html 您需要将其重命名,并将 'counter' 前缀重命名为更适合您的应用程序的名称,但至少您有可以开始使用的代码。
猜你喜欢
  • 2012-08-03
  • 2013-03-11
  • 1970-01-01
  • 2014-12-21
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多