WSO2 XSLT Mediator解析异常:同配置服务器表现不一致求助
解决WSO2 XSLT Mediator解析差异问题
这种配置完全一致的两台WSO2服务器却出现XSLT解析行为不同的情况确实很让人困惑,我来分享几个可能的原因和对应的排查、解决方法:
1. XSLT处理器版本/支持模式差异
你用到的<xsl:template match="Id[some $sib in preceding-sibling::Id satisfies deep-equal(., $sib)]"/>是XSLT 2.0及以上的语法,而报错提示需要node-set()通常是XSLT 1.0环境下的特征(因为1.0不支持原生的节点集操作和some这类量化表达式)。
即使你说配置文件一致,也可能存在以下情况:
- 两台服务器底层使用的XSLT处理器不同:一台用了支持2.0的Saxon,另一台用了仅支持1.0的Xalan。
- 检查
axis2.xml中XSLT Mediator的配置:查找<parameter name="XSLTTransformerFactory">项,确认值是否一致。比如:- 配置为
net.sf.saxon.TransformerFactoryImpl表示启用Saxon(支持XSLT 2.0+) - 配置为
org.apache.xalan.xsltc.trax.TransformerFactoryImpl则是Xalan(默认XSLT 1.0)
- 配置为
2. 类加载冲突或jar版本不一致
WSO2的类加载机制可能导致实际运行时加载的XSLT处理器jar版本不同:
- 对比两台服务器
<WSO2_HOME>/lib目录下的xslt相关jar(比如saxon*.jar、xalan*.jar),确保版本完全一致。 - 检查部署的Carbon应用(CApp)中是否包含了自定义的XSLT处理器jar,导致某台服务器加载了非默认的处理器。
3. 缓存残留导致的旧逻辑生效
WSO2会缓存已编译的XSLT模板和相关资源,即使重新部署,旧缓存可能没有被清理:
- 停止服务器,删除
<WSO2_HOME>/tmp和<WSO2_HOME>/work目录下的所有内容,然后重启服务器重新测试。
4. 配置文件被层级覆盖
有时候看似一致的配置文件,可能被节点级或其他层级的配置覆盖:
- 检查两台服务器的
<WSO2_HOME>/repository/conf/axis2/axis2.xml,如果是集群环境,还要确认节点本地的axis2.xml是否和主配置一致。 - 确保没有通过系统属性或启动参数强制指定了不同的XSLT处理器。
临时适配方案(如果需要兼容XSLT 1.0)
如果暂时无法调整服务器的XSLT版本支持,可以把原XSLT 2.0的去重逻辑改成XSLT 1.0兼容的写法,比如用key和generate-id:
<xsl:key name="unique-id" match="Id" use="."/> <xsl:template match="Id[not(generate-id() = generate-id(key('unique-id', .)[1]))]"/>
内容的提问来源于stack exchange,提问作者viswanath A v k
相关产品推荐
相关产品推荐

