2017-02-17 4 views
1

Мне нужно, чтобы 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 не будет работать в моем фактическом использовании. Благодарю.

+0

Вы должны сказать, что XSLT процессор вы используете. API JAXP не определяет какой-либо механизм для вызова из XSLT в Java, и соглашения различаются между разными процессорами, реализующими JAXP API. –

+0

@Michael Kay Я использую Java 8 и, кажется, собираю Xalan –

+0

Тогда извините, я не могу помочь с Xalan. –

ответ

1

Для того, чтобы получить эту линию работы:

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

Параметр может быть передан в статической функции:

class Test { 

    public static void get(Object context) { 
    // here "context" is the instance "test1" 
    } 
... 
+0

Это единственный способ, которым я найдено, чтобы вызвать методы экземпляра в Xalan. Странно, что это не было поддержано. Несмотря на то, что для привязки метода java с параметром Object требуется обертка, он работает, и обертка не имеет большого значения. – Grief

Смежные вопросы