Мне нужно, чтобы XSLT вызывал метод на экземпляре Java, который я передаю в качестве параметра. Пока я могу заставить его работать, если я создам экземпляр в самом 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";
}
}
и вот мой 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 не будет работать в моем фактическом использовании. Благодарю.
Вы должны сказать, что XSLT процессор вы используете. API JAXP не определяет какой-либо механизм для вызова из XSLT в Java, и соглашения различаются между разными процессорами, реализующими JAXP API. –
@Michael Kay Я использую Java 8 и, кажется, собираю Xalan –
Тогда извините, я не могу помочь с Xalan. –