当前位置: 首页 > 知识库问答 >
问题:

XSLT-调用Java方法-给出:非静态Java函数“doubleIntEcho”的第一个参数不是有效的对象引用

葛骏
2023-03-14

我想从XSLT样式表中调用Java(扩展)方法。

错误消息为:

非静态Java函数“doubleIntEcho”的第一个参数不是有效的对象引用。

我的简化POC由4部分组成:

1.XML:文件

<?xml version="1.0"?>
<value>
    <amount>1</amount>
    <amount>2</amount>
    <amount>3</amount>
</value>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:jcall="java:x.y.z.XsltCallingJavaEchoTwice">
    <xsl:output method="xml"/>

    <xsl:template match="/value">
        <value>
            <xsl:apply-templates select="amount"/>
        </value>
    </xsl:template>

    <xsl:template match="amount">
        <xsl:copy>
            <value>
                <xsl:value-of select="text()"/>
            </value>
            <value-int>
                <xsl:value-of select="jcall:doubleIntEcho(number(.))"/>
            </value-int>
            <value-string>
                <xsl:value-of select="jcall:doubleStringEcho(text())"/>
            </value-string>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

3.Java类的扩展:

package x.y.z;

public class XsltCallingJavaEchoTwice {
    public static String doubleStringEcho( String input) {
        return "Source=" + input + ", echo=" + input + ", echo2=" + input;
    }
    public static int doubleIntEcho( int input) {
        return input + input;
    }
}

4.启动XSLT转换过程的Java环境:

public class XsltFilterParentWithAllChildren {

  private static final String XML_FILENAME = "files/xslt-call-java-amounts.xml";
  private static final String XSLT_FILENAME = "files/xslt-call-java-xsl.xsl";
  private static final String XML_OUTPUT_FILENAME = "files/output.xml";

  public static void main(String[] args) {
    deleteFile( XML_OUTPUT_FILENAME);
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try (InputStream is = new FileInputStream(XML_FILENAME)) {
      DocumentBuilder db = dbf.newDocumentBuilder();
      Document doc = db.parse(is);
      try (FileOutputStream output = new FileOutputStream(XML_OUTPUT_FILENAME)) {
        transform(doc, output);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }   
  private static void transform(Document doc, OutputStream output) throws TransformerException {
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer(
            new StreamSource(new File(XSLT_FILENAME)));
    transformer.transform(new DOMSource(doc), new StreamResult(output));
  }   
  private static void deleteFile( String pathname) {
    new File( pathname).delete();
  }
}

共有1个答案

卫增
2023-03-14

正在查看https://xalan.apache.org/xalan-j/extensions.html#ext-func调用我更希望看到,例如,xmlns:java=”http://xml.apache.org/xalan/java“然后例如

 类似资料:
  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是

  • 这个问题相当复杂,我不知道以前是否有人问过,因为我不知道如何在搜索框中表达这个问题。 下面是代码: 静态成员将在更多静态方法中再次使用,但我需要首先将其时区设置为“UTC”。有没有方法调用<code>。setTimeZone(“UTC”)一劳永逸?或者我必须调用<code>。setTimeZone(“UTC”)在每个静态方法中?

  • 本文向大家介绍在一个静态方法内调用一个非静态成员为什么是非法的?相关面试题,主要包含被问及在一个静态方法内调用一个非静态成员为什么是非法的?时的应答技巧和注意事项,需要的朋友参考一下 由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

  • mainactivity.java: xmlReader.java: (如果需要,我也可以为station.java和dbhandler.java添加代码) 我怎样才能绕过这个编程悖论呢?我通常能为这里的任何问题找到答案,但这是我第一次找不到答案。如果你知道我错过的解决方案的链接,请在下面发布。多谢。

  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

  • 在从getCsvRow调用getCol列时,获取非法转发引用的CE。列表列=getCsvColumn.apply(null); 需要你的帮助来解决这个问题。 我知道的一种方法是将函数接口转换为java方法,然后我可以从"getCsvRow"调用方法"getCol列" 寻找其他解决方案