0

Saxon が WSO2 ESB 4.5 の XSLT プロセッサ (HE エディション) になったため、XSLT スタイルシート (ESB 4.0.3 の Xalan で利用可能) のカスタム Java 関数のサポートが失われたのではないかと思っています。

ESB 4.0.3 で動作するオリジナルの XSLT:

カスタムの DateParser.jar を esb4.5.0/repository/components/dropins にコピーしました

<xsl:stylesheet extension-element-prefixes="transform" version="1.0"
   xmlns:transform="xalan://my.extension.DateParser"
     ...
   <xsl:value-of select="transform:sdf('dd.MM.yyyy HH:mm:ss',./timestamp)"/>

これはエラーログに表示されました(短縮):

  ERROR XSLTMediator Unable to perform XSLT transformation using :
  Caused by: net.sf.saxon.trans.XPathException: Cannot find a matching  function named    {xalan://my.extension.DateParser}sdf()

XSLT を Saxon 用に変更しました。ESB 4.5.0 では動作しません ###

Saxon はカスタム Java 関数を Xalan とは異なる方法で処理するため、XSLT-Stylesheet を次のように変更しました。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:transform="java:my.extension.DateParser" 
       ...
     <xsl:value-of select="transform:sdf('dd.MM.yyyy HH:mm:ss',./timestamp)"/>

これがエラーログに表示されました(短縮):

 Caused by: net.sf.saxon.trans.XPathException: Cannot find a matching ... function named {java:my.extendsion.DateParser}sdf(). Note that direct calls to Java methods are not available under Saxon-HE

標準の WSO2 ESB ディストリビューション (Saxon-HE を含む) では、「Java メソッドの直接呼び出し」がサポートされないのではないかと考えています。Saxon-Enterprise (有料版) として、このサポートを提供します。

4

1 に答える 1

0

使用されている XSLT-Processor SAXON-HE バージョンではこの拡張ポイントが禁止されているため、XSLT-Stylesheets によって呼び出されるカスタム Java 関数を取得する方法が見つかりませんでした。

おそらく、この「回避策」または代替アプローチは、他の人にも役立つ可能性があります。

XSLT-Stylesheet 内でカスタム Java 関数を呼び出す代わりに、次のようなシーケンス内でPojoCommand (これは単なる例/デバッグ スニペットです) を使用してメッセージを変換しました。

 <sequence>
    <log category="INFO" level="full" separator=","/>
    <pojoCommand name="foo.bar.DebugCommand">
     <property name="append" value="bar"/>
     <property action="ReadAndUpdateMessage" expression="//dummy3/text()" name="original"/>
    </pojoCommand>
    <log category="INFO" level="full" separator=","/>
    <drop/>
 </sequence>

テキスト ノードを変換し、周囲の XML タグを保持するだけの場合は、 XPath 関数/text()を忘れないでください。

これは DebugCommand の実装です:

 import org.apache.synapse.Command;
  ...
 public class DebugCommand implements Command{

 private static Log log = LogFactory.getLog(DebugCommand.class);
 private String original = null;
 private String append = null;
 private String appendedOriginal;


 @Override
 public void execute() {
    log.info("Entering:"+toString());
    appendedOriginal = ""+original+":"+append;
    original = appendedOriginal;
    log.info("Exiting:"+toString());
 }


public String getOriginal() {
    return original;
}


public void setOriginal(String original) {
    this.original = original;
}


public String getAppend() {
    return append;
}


public void setAppend(String append) {
    this.append = append;
}


public String getAppendedOriginal() {
    return appendedOriginal;
}


public void setAppendedOriginal(String appendedOriginal) {
    this.appendedOriginal = appendedOriginal;
}


@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("DebugCommand [original=");
    builder.append(original);
    builder.append(", append=");
    builder.append(append);
    builder.append(", appendedOriginal=");
    builder.append(appendedOriginal);
    builder.append("]");
    return builder.toString();
}
  }
于 2012-10-11T19:43:07.400 に答える