javascript - 如何在 XSLT 中包含对 JavaScript 的调用?

标签 javascript xslt xalan

我试图在 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, ]>.

最佳答案

  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>

关于javascript - 如何在 XSLT 中包含对 JavaScript 的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18870682/

相关文章:

javascript - 在 ChartJs 的 Linechart 点内添加图像

search - XSL 多重搜索替换功能

xslt - 在哪里为共享点列表添加禁用输出转义?

xslt - 找不到主类: org. apache.xalan.xslt.Process

javascript - Q.all 用于非 promise 和 promise 组合

javascript - Vue JS typescript 组件找不到注入(inject)实例属性

JavaScript:使用工厂函数中的内部原型(prototype)方法从数组返回评级值

xml - XSLT 插入 TXT 文件

java - 在 JBoss 中通过 XSLT 调用 Java 函数会抛出转换器异常(在 tomcat 中有效)

java - 使用 Xalan xslt 捕获异常