8

私は Saxon (必要に応じて Xalan を使用できます) XSLT プロセッサを使用して何らかの変換を行っています。以下のオブジェクトのインスタンスをパラメーターとして XSLT テンプレートに渡したいと思います。

public class Test {
   private String value;

   public Test(String v) {
       value = v;
   }
   //getters, setters etc.
}

したがって、このオブジェクトを作成します。

Test test = new Test("test");
transformer.setParameter("test", test);

XSLT ファイルでは、param を次のように宣言します。

<xsl:param name="test" required="yes" as="jt:com.whatever.package.Test" xmlns:jt="http://saxon.sf.net/java-type"/>

ここで私の質問は、XSLT 内でこのオブジェクトのインスタンス メソッド (つまり getValue() ) を呼び出すにはどうすればよいかということです。それは可能ですか?さまざまなJavaクラスの静的メソッドを呼び出すことができることは知っていますが、それはまさに私が探しているものではありません.

また、XSLT内にJavaオブジェクトを移入することは可能ですか? オブジェクトのインスタンスのセッター メソッドを呼び出し、変換が完了した後、このオブジェクトを Java コードで新しい値と共に使用しますか?

4

4 に答える 4

7

説明した方法でパラメーターとして渡された「外部オブジェクト」のインスタンスメソッドを呼び出すことができるはずです。がその$objectようなオブジェクトであり、がそのクラスであり、このオブジェクトでcom.package.MyClassメソッドを呼び出したい場合、getColor()

(a) 次のような名前空間を宣言する必要があります。xmlns:MyClass="java:com.package.MyClass"

(b) メソッドを次のように呼び出しますMyClass:getColor($object)

Java を呼び出すためのこのメカニズムは、Saxon では「再帰拡張関数」と呼ばれます。Saxon Home Edition ではサポートされていません。Saxon Professional Edition または古いオープンソースの Saxon-B 製品が必要です。Saxon-HE には「統合拡張関数」と呼ばれる別のメカニズムがありますが、Java 側で引数と結果の型を宣言するためにもう少しコーディングが必要です。

再帰拡張関数を使用する場合、Saxon は Java 型を XPath 型にマップする方法について最善の推測を行っており、特にコレクション型を使用する場合は、常に希望どおりにマッピングするとは限らないことに注意する必要があります。

セッター メソッドなど、副作用のあるメソッドの使用は避けてください。Saxon には、そのような呼び出しが特定の順序で実行されることを保証する絶対的に信頼できる方法はありません。Saxon オプティマイザーは、呼び出しをまったく行わないようにクエリを編成する方法を見つけることがあります。そのような呼び出しを行う必要がある場合は、呼び出しが結果 (空のシーケンスなど) を返すかのように扱い、結果が返された場合に結果がスタイルシート出力に表示されるように呼び出しを使用します。

于 2012-10-07T08:54:32.950 に答える
3

これはここで徹底的に説明されています

http://www.saxonica.com/html/documentation/extensibility/functions/

短い例:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:date="java:java.util.Date" exclude-result-prefixes="date">

<xsl:template match="/">
  <html>
    <xsl:if test="function-available('date:to-string') and
                          function-available('date:new')">
      <p><xsl:value-of select="date:to-string(date:new())"/></p>
    </xsl:if>
  </html>
</xsl:template>

</xsl:stylesheet>

任意の XML ドキュメント (使用されていない) に適用すると、必要な正しい結果が生成されます。

<html>
   <p>Sat Oct 06 11:41:30 PDT 2012</p>
</html>
于 2012-10-06T18:39:25.597 に答える
2

私は Xalan を使用してずっと前にこれを行いました。まず、xslt に以下を追加する必要があります (他のすべての属性を追加する必要はないと思います)。

<xsl:param name="test" />

そして、メソッドを呼び出すには、次のことができます

<xsl:value-of select="test:getValue()"/>
于 2012-10-06T16:56:27.327 に答える