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

Joh*_* Au 2 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> 
Run Code Online (Sandbox Code Playgroud)

我在XML转换器中遇到此错误:

<Location of error unknown>java.lang.NoSuchMethodException: For extension function, could not find method java.lang.String.response<ExpressionContext, ]>.
Run Code Online (Sandbox Code Playgroud)

kjh*_*hes 6

  1. 遵循Apache的Xalan-Java JavaScript扩展指令,特别注意在类路径中包含js.jarbsf.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>
Run Code Online (Sandbox Code Playgroud)

按预期产生以下输出:

<?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>
Run Code Online (Sandbox Code Playgroud)

  • XSLT扩展机制正在利用XML命名空间机制.'MyCounter'可能是这里给出的JavaScript扩展示例的遗留问题:http://xml.apache.org/xalan-j/extensions.html您需要将它和'counter'前缀重命名为更适合您应用的东西,但至少你有工作代码可以开始. (2认同)