0

我想知道我们是否失去了对 XSLT-Stylesheets 的自定义 Java 函数支持(ESB 4.0.3 中的 Xalan 可用),因为 Saxon 现在是 WSO2 ESB 4.5 中的 XSLT 处理器(HE 版)?

原始 XSLT,与 ESB 4.0.3 一起使用:

我在 esb4.5.0/repository/components/dropins 中复制了自定义 DateParser.jar

<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()

为 Saxon 更改了 XSLT,不适用于 ESB 4.5.0 ###

由于 Saxon 以与 Xalan 不同的方式处理自定义 java 函数,因此我像这样更改了 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 样式表调用的自定义 java 函数,因为使用的 XSLT 处理器 SAXON-HE 版本禁止此扩展点。

也许这种“解决方法”或替代方法也可能对其他人有所帮助:

我没有在 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 回答