如何在传入XSLT的Java实例上调用方法?

如何在传入XSLT的Java实例上调用方法?,java,xml,xslt,Java,Xml,Xslt,我需要让XSLT在作为参数传递的Java实例上调用一个方法。到目前为止,只有在XSLT本身中创建实例,我才能让它工作。如果我尝试在传递的实例上调用它,它将失败 Exception in thread "main" javax.xml.transform.TransformerConfigurationException: Cannot find external method 'Test.get' (must be public). 我可以通过输出实例(它作为toString输出)来证明该实

我需要让XSLT在作为参数传递的Java实例上调用一个方法。到目前为止,只有在XSLT本身中创建实例,我才能让它工作。如果我尝试在传递的实例上调用它,它将失败

Exception in thread "main" javax.xml.transform.TransformerConfigurationException: 
Cannot find external method 'Test.get' (must be public).
我可以通过输出实例(它作为toString输出)来证明该实例的传递是正常的。这是我的Java:

public class Test {

    public static void main(String[] args) throws Exception {
        Transformer transformer = TransformerFactory.newInstance()
            .newTransformer(
            new StreamSource(Test.class.getResourceAsStream("test.xsl")));
        transformer.setParameter("test1", new Test());
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        transformer.transform(new StreamSource(
            new ByteArrayInputStream(
            "<?xml version=\"1.0\"?><data></data>".getBytes())),
            new StreamResult(outputStream));
        System.out.println(outputStream.toString());
    }

    public String get() {
        return "hello";
    }

    @Override
    public String toString() {
        return "An instance of Test";
    }
}
公共类测试{
公共静态void main(字符串[]args)引发异常{
Transformer Transformer=TransformerFactory.newInstance()
.新变压器(
新的StreamSource(Test.class.getResourceAsStream(“Test.xsl”);
setParameter(“test1”,newtest());
ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
transformer.transform(新StreamSource)(
新ByteArrayInputStream(
“”.getBytes()),
新的StreamResult(outputStream));
System.out.println(outputStream.toString());
}
公共字符串get(){
回复“你好”;
}
@凌驾
公共字符串toString(){
返回“一个测试实例”;
}
}
这是我的xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:test="xalan://Test"
                exclude-result-prefixes="test"
>

    <xsl:param name="test1" />
    <xsl:variable name="test2" select="$test1"/>
    <xsl:variable name="test3" select="test:new()"/>

    <xsl:template match="/">
        <data>
            <!-- proves that the instance is really being passed -->
            <xsl:value-of select="$test1"/>
        </data>
        <data>
            <!-- first two do not work -->
            <!--<xsl:value-of select="test:get($test1)"/>-->
            <!--<xsl:value-of select="test:get($test2)"/>-->
            <!-- this one does work -->
            <xsl:value-of select="test:get($test3)"/>
        </data>
    </xsl:template>
</xsl:stylesheet>


有人知道我如何使用传递的参数来实现这一点吗?在XSLT中实例化它在我的实际用例中是行不通的。谢谢。

为了使这条线路正常工作:

<xsl:value-of select="test:get($test1)"/>

我也面临同样的问题。检查后发现我们需要使用以下依赖项

        <dependency>
            <groupId>xalan</groupId>
            <artifactId>serializer</artifactId>
            <version>2.7.2</version>
        </dependency>
        
        
        <dependency>
            <groupId>xalan</groupId>
            <artifactId>xalan</artifactId>
            <version>2.7.2</version>
        </dependency>

沙兰
序列化程序
2.7.2
沙兰
沙兰
2.7.2

添加这些依赖项后,我的代码开始工作。

您需要说明您使用的XSLT处理器。JAXP API没有定义任何从XSLT调用Java的机制,实现JAXP API的不同处理器之间的约定也各不相同。@Michael Kay我使用的是Java 8,它似乎在学习Xalant。抱歉,我无法帮助Xalan。这可能是我在Xalan中找到的调用实例方法的唯一方法。奇怪的是,它没有被提升。尽管它需要使用对象参数包装到目标java方法,但它可以工作,包装也不是什么大问题。
        <dependency>
            <groupId>xalan</groupId>
            <artifactId>serializer</artifactId>
            <version>2.7.2</version>
        </dependency>
        
        
        <dependency>
            <groupId>xalan</groupId>
            <artifactId>xalan</artifactId>
            <version>2.7.2</version>
        </dependency>