昨天在用xalan处理xslt样式表时遇到了以下异常:com.sun.org.apache.xml.internal.utils.URI$MalformedURIException: URI 中未找到模式.因为处理的这个样式表原来在Stylus Studio里面使用过,显示是正常的,这里应该也不会有什么问题,但是在重构代码的时候将xsl文件的读取由硬编码文件路径改成为用ClassLoader的getResource方法来进行读取了.
开始的时候丝毫没有意识到是这里出了问题,还以为是xsl文件中引用的uri出了问题(因为上面那个异常导致了xalan编译xsl样式表的时候无法找到import的locale.xsl文件,于是编译器又报了locale.xsl中定义的变量找不到的错误,就是这个错误误导了我好长时间而没有发现错误的源头),修改了好半天的xsl文件都没发现有问题,而且用xalan.jar直接进行xslt转换可以通过,弄了一个晚上也没搞懂到底是怎么回事,彻底没想法掉了那个时候.
今天放松了一天,回来继续看的时候去看了一下uri解析的源码,本来想看看这个uri到底是怎么解析而后出错的,好不容易找到这段报错在源码中的位置,但是看不懂这里到底怎么解析的,和其他部分源码的关联太高了,不过看的时候看到了解析的时候有关于slash符号”/”的解析,有种顿悟的感觉,因为前面ClassLoader的getResource方法给出的绝对路径是以”/”开始的(像/G:/src/xsl/folder.xsl这种形式),开始看着就觉得很奇怪,但是直接使用这个路径确实找的到样式表所以也就没去多想,但是实际情况是xalan如果用这种路径访问样式表对于样式表中import的样式表就找不到(异常显示说没有这种模式)!
不知道这算不算是xalan的一个bug呢?或者是jdk的一个bug,ClassLoader的getResource方法给出的路径为什么前面加上一个”/”要?呼,即使不是一个bug的话,也是在这两个api同时使用时会出现的一个问题,解决方法很简单,把getResource得到的路径前面的”/”去掉就可以了,xalan一下就通过了这一样式表的编译,其他地方对这一路径的使用也没问题.