2010-12-16

XML Tagung in Stuttgart

Xing收到了明年3月1日在斯图加特举行的一个XML会议的邀请,其中的一名报告者为Dr. Michael Key。如果和XML打过些交道的人想必都听说过这个名字。他参与了XSLT 2.0和XPATH 2.0标准的制定,有自己实现的XSLT processor SAXON,并且写了多本关于XPATH和XSLT的书籍,如XPath 2.0 Programmer's Reference,XSLT 2.0 Programmer's Reference,XSLT 2.0 and XPath 2.0 Programmer's Reference,是一位名副其实的XML专家。他在很多mailing list也很活跃,常常参与有关XSL的讨论和解答有关的问题。本来有个Stuttgart的项目找人,但因为时间上不合适放弃了,否则倒是想去凑个热闹,听听这些站在XML技术最前沿的人能带来什么新鲜的东西。不过想到参加这个会议的报名费(包括一顿自助午餐)也不便宜,普通250欧元,有折扣券的180欧元,也不觉得不参加有多大遗憾 :) 。

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 ;
     } 
}

2010-12-13

XPATH点滴

XPATH 1.0中一个XPATH表达式返回一个节点的集合(node set),因为是一个集合,所以不存在节点顺序的概念。而在XPATH 2.0中一个表达式返回的则是一个节点序列(sequence of nodes),顺序为document order。

/ 符号:以前基本上认为就是在轴上分隔不同的节点。更广义的理解是这是一个高阶的运算符。比如$EXP1和$EXP2 分别为两个节点集合,那么$EXP1/$EXP2表示对$EXP1中的每一个节点对$EXP2求值,$EXP1/$EXP2的值即为:对$EXP1中每个节点对$EXP2求值的集合。

对轴的理解:轴实际上是一种节点间一对多的映射,可以把轴理解为一种函数,输入为一个单个节点,输出为与该节点有某种关系的节点的集合。

(@code,"N/A")[1]:如果code属性的值不为空,那么这个表达式的值即为code属性的值,否则返回”N/A”。因为当code属性的值为空时,通过运算符逗号 “,” 创建的sequence只有一个item即”N/A”,筛选条件[1]选择sequence中第一个元素。

2010-12-10

实物恋

早上起来打开电视正播放ARD的新闻。很多德国人对柏林墙都是恨之入骨,可是新闻里正报道的一位在柏林生活的美国人对柏林墙却有性喜好。她先是数年前在法国巴黎与埃菲尔铁塔成亲,之后又辗转到柏林,爱上了残余的柏林墙。报道之后采访了一位医学教授,据说德国约有50多名性取向目标为实物。有同性恋,没想到还有实物恋。刚好赶上这条新闻是节目的最后一条,另外估计这个确实罕见,ARD的播音员已经忍不住笑着说了结束语。新闻节目消音后,屏幕上还能看到这位一向严肃的女播音员已经大笑不止了。这和我们的播音员在播音结束后还正襟危坐等待画面切开截然不同。

2010-12-09

不能加载SAPJCORFC

操作系统为Windows 7 64bit Enterprise,JDK版本为32bit的"1.5.0_22"。按照sapjco2的说明已经把sapjcorfc.dll和librfc32.dll复制到目录c:\system\windows\system32,可是仍然得到错误:
Exception in thread "main" java.lang.ExceptionInInitializerError: JCO.classInitialize(): Could not load middleware layer 'com.sap.mw.jco.rfc.MiddlewareRFC'
JCO.nativeInit(): Could not initialize dynamic link library sapjcorfc [no sapjcorfc in java.library.path]. java.library.path [C:\Program Files (x86)\Java\jdk1.5.0_22\bin;.;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\Java\jdk1.5.0_22\bin; C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\ThinkPad\Bluetooth Software\;C:\Program Files\ThinkPad\Bluetooth Software\syswow64;C:\Program Files (x86)\Windows Live\Shared;c:\cygwin\bin;C:\Users\dingjun.jia\Documents\Data\UnxUtils\usr\local\wbin;C:\Users\dingjun.jia\Documents\Data\projects\o2 SAP\cmd;]
    at com.sap.mw.jco.JCO.<clinit>(JCO.java:820)
    at JM_I025B.countVendorData(JM_I025B.java:26)
    at JM_I025B.main(JM_I025B.java:10)
很明显是找不到sapjcorfc.dll,所以不能加载。把sapjcorfc.dll和librfc32.dll这两个文件复制到jdk的bin目录下,也就是上面错误中的第一个目录中,就能正确加载了。难道java只在目录列表中的第一个目录去寻找。