2010-12-14

在XSLT中调用Java函数

在为客户实现一个sap PI的interface时,用XSLT去生成IDoc的XML文件形式,通过sap PI的IDoc adapter发送IDoc。由于客户现在用SAP替代了旧的Oracle系统,需要映射一些如Cost Centre和Profit Centre的东西,映射所需的表在SAP PI系统中。要读取数据库中的东西借助XSLT不容易实现,只能用Java。在Java代码中使用SAP JCO读取并返回了正确的值,但是在XSLT中调用JAVA函数却大费了一番周折,问题主要出在该如何声明自定义的命名空间才能使XSLT processor能找到编译好的Java class文件,以调用Java类中定义的函数。
当XSLT文件和Java class文件位于一目录下,经过测试,在Altova XML Spy下,命名空间需要声明为:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:myns="java:Test" exclude-result-prefixes="myns">
其中需要注意的是在xmlns:myns="java:Test" exclude-result-prefixes="myns"中,java不能省掉,Test为Java class的名字,否则Altova 的XSLT processo找不到声明的Java class,会返回ClassNotFound exception。
而在SAP PI 7.0环境下,声明自定义的命名空间必须去掉“java:”,否则也会出现找不到Java class的错误。
示例:
XSLT文件
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:myns="java:Test" exclude-result-prefixes="myns">
 
<xsl:template match="/">
<root>
<text><xsl:value-of select="myns:foo(‘hello’, ‘world’)" /></text>
</root>
</xsl:template>
</xsl:stylesheet>
Java class
public class Test {
     public static String foo(String str1, String str2) {
     return str1 + “ ” + str2 ;
     } 
}

1 条评论: