2017-02-17 67 views
1

我需要讓XSLT調用一個作爲參數傳遞給我的Java實例的方法。到目前爲止,如果我在XSLT本身中創建實例,我只能讓它工作。如果我試圖用如何在傳入XSLT的Java實例上調用方法?

Exception in thread "main" javax.xml.transform.TransformerConfigurationException: 
Cannot find external method 'Test.get' (must be public). 

調用它傳遞的實例失敗,我可以證明該實例被傳遞通過輸出就OK了(它出來作爲了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處理器。 JAXP API沒有定義任何從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中調用實例方法。奇怪的是,它沒有upvoted。儘管它需要使用Object參數來定位java方法,但它的工作原理和包裝並沒有什麼大不了的。 – Grief