我正试图从XSLT调用静态java代码。我的XSLT文件如下所示
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="interface.dev"
exclude-result-prefixes="ns1"
xmlns:xltxe="http://www.ibm.com/xmlns/prod/xltxe-j"
xmlns:countryCode="http://com.abc/common/utils">
<xltxe:java-extension prefix="countryCode" class="com.abc.common.utils.CountryStaticInfo"/>
<xsl:variable name="var" select="ns1:parties/ns1:party[@code='BNE']/ns1:country"/>
<xsl:template match="/ns1:import_lc_iss">
<html>
<body>
<table border="1">
<tr>
<xsl:value-of select="countryCode:getCountryCode($var)" />
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我的Java代码如下:
public synchronized static String getCountryCode(String aS_ctryCode) throws Exception, StaticInfoException {
ArrayList lAL_entities = com.abc.services.JavaProgramContext.getServerEntities();
return getCountryCode(lAL_entities.get(0).toString(),aS_ctryCode);
}
我收到以下错误
RROR:'非静态Java函数的第一个参数 'getCountryCode'不是有效的对象引用 46860 [main]错误 - 无法通过xslt转换收到的消息 javax.xml.transform.TransformerConfigurationException:无法编译样式表 at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:828) 在com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:617)
第1次修订:支持xalan的新xslt
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="interface.dev"
exclude-result-prefixes="ns1"
xmlns:xalan="http://xml.apache.org/xalan"
extension-element-prefixes="xalan"
xmlns:java="java"
xmlns:util="com.abc.common.utils.CountryStaticInfo">
<xltxe:java-extension prefix="countryCode" class="com.abc.common.utils.CountryStaticInfo"/>
<xsl:variable name="var" select="AU"/>
<xsl:template match="/ns1:import_lc_iss">
<html>
<body>
<table border="1">
<tr>
<xsl:variable name="new-pop" select="com.abc.common.utils.CountryStaticInfo.getCountryCode(string(@var))"/>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:3)
以下示例遵循http://xml.apache.org/xalan-j/extensions.html#ext-functions中的文档和示例,适用于Oracle JRE 8,XSLT是
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:java="http://xml.apache.org/xalan/java" exclude-result-prefixes="java">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>sheet1.xsl</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="country-list">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="country">
<li>
<xsl:value-of select="java:org.example.MyClass.getCountryCode(.)"/>
</li>
</xsl:template>
</xsl:stylesheet>
包org.example
中的Java类库有
package org.example;
import java.util.HashMap;
import java.util.Map;
public class MyClass {
private static final Map<String, String> COUNTRY_LIST = new HashMap<>();
static {
COUNTRY_LIST.put("Spain", "es");
COUNTRY_LIST.put("USA", "us");
}
public static String getCountryCode(String name) {
return COUNTRY_LIST.get(name);
}
}
然后JRE中的内置Transformer
可以很好地转换此示例。