2017-02-17 23 views
1

私はパラメータとして渡すJavaインスタンス上でメソッドを呼び出す必要があります。これまでは、XSLT自体にインスタンスを作成するだけで、動作させることができます。私は渡されたインスタンス上で、それを呼び出そうとした場合には、XSLTに渡されたJavaインスタンスのメソッドを呼び出すにはどうすればよいですか?

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

で失敗し、私は(それがのtoStringとして出てくる)のインスタンスは、それを出力して[OK]を渡されていることを証明することができます。ここに私の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のインスタンスメソッドを呼び出すことが判明しました。奇妙なことに、それはあきらめられなかった。 ObjectパラメータでJavaメソッドをターゲットにするにはラッピングが必要ですが、動作し、ラッピングは大したことではありません。 – Grief

関連する問題