Saxon-HE Java 扩展函数(配置问题)
Saxon-HE Java Extension Functions (Problem configuring)
我目前使用的是 Saxon9 开源版本,扩展用 Java 编写。我正在尝试迁移到 SaxonHE,并且我已阅读此处显示的文档和示例。
Java extension functions: full interface
和
当我尝试执行我的 XSLT 转换时,遇到我的外部 java 函数之一时出现这样的错误。
XPST0017: Cannot find a 2-argument function named
Q{http://com.commander4j.Transformation.XSLT_Ext_NVL}nvl()
这就是我到目前为止所做的。
我的java扩展函数是这样写的
import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.SequenceType;
import net.sf.saxon.value.StringValue;
public class XSLT_Ext_NVL extends ExtensionFunctionDefinition
{
@Override
public SequenceType[] getArgumentTypes()
{
return new SequenceType[]{SequenceType.SINGLE_STRING, SequenceType.SINGLE_STRING};
}
@Override
public StructuredQName getFunctionQName()
{
return new StructuredQName("c4j_XSLT_Ext_NVL", "http://com.commander4j.Transformation.XSLT_Ext_NVL", "nvl");
}
@Override
public SequenceType getResultType(SequenceType[] arg0)
{
return SequenceType.SINGLE_STRING;
}
@Override
public ExtensionFunctionCall makeCallExpression()
{
return new ExtensionFunctionCall() {
@Override
public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
String value = ((StringValue)arguments[0]).getStringValue();
String defaultValue = ((StringValue)arguments[1]).getStringValue();
String result = "";
if (value == null)
{
value = "";
}
result = value;
if (result.equals(""))
{
result = defaultValue;
}
return StringValue.makeStringValue(result);
}
};
}
}
我创建了一个如下所示的 Saxon 配置文件。我的示例看起来与 Saxon 网站上的示例略有不同,因为该示例在 class 名称后包含由 $ 分隔的函数名称 - 当我尝试它时,我收到一条错误消息,指出 Saxon 无法找到 class.
edition="HE"
licenseFileLocation=""
label="c4jMiddleware">
<resources>
<extensionFunction>com.commander4j.Transformation.XSLT_Ext_NVL</extensionFunction>
</resources>
</configuration>
我正在使用此语法加载配置。
Source xmlSource = new StreamSource(new File(System.getProperty("user.dir") + File.separator + "xml" + File.separator + "config" + File.separator +"SaxonConfiguration.xml"));
Configuration.readConfiguration(xmlSource);
下面是我的 XSLT 的摘录,它试图调用 java 函数。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:c4j="http://www.commander4j.com"
xmlns:c4j_XSLT_Ext_NVL="http://com.commander4j.Transformation.XSLT_Ext_NVL"
xmlns:c4j_XSLT_Ext="http://com.commander4j.Transformation.XSLTExtension"
exclude-result-prefixes="xs c4j c4j_XSLT_Ext" version="2.0">
<xsl:output encoding="UTF-8" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
.
.
.
<xsl:template match="xml">
<xsl:param name="pack_conv" select="c4j_XSLT_Ext_NVL:nvl($pack_conv_temp, '1')"/>
如果有人能告诉我哪里出错了,我将不胜感激。
戴夫
正如 Martin 所建议的,最可能的解释是您实际上并没有使用通过读取配置文件创建的配置。
我目前使用的是 Saxon9 开源版本,扩展用 Java 编写。我正在尝试迁移到 SaxonHE,并且我已阅读此处显示的文档和示例。
Java extension functions: full interface
和
当我尝试执行我的 XSLT 转换时,遇到我的外部 java 函数之一时出现这样的错误。
XPST0017: Cannot find a 2-argument function named
Q{http://com.commander4j.Transformation.XSLT_Ext_NVL}nvl()
这就是我到目前为止所做的。
我的java扩展函数是这样写的
import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.SequenceType;
import net.sf.saxon.value.StringValue;
public class XSLT_Ext_NVL extends ExtensionFunctionDefinition
{
@Override
public SequenceType[] getArgumentTypes()
{
return new SequenceType[]{SequenceType.SINGLE_STRING, SequenceType.SINGLE_STRING};
}
@Override
public StructuredQName getFunctionQName()
{
return new StructuredQName("c4j_XSLT_Ext_NVL", "http://com.commander4j.Transformation.XSLT_Ext_NVL", "nvl");
}
@Override
public SequenceType getResultType(SequenceType[] arg0)
{
return SequenceType.SINGLE_STRING;
}
@Override
public ExtensionFunctionCall makeCallExpression()
{
return new ExtensionFunctionCall() {
@Override
public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
String value = ((StringValue)arguments[0]).getStringValue();
String defaultValue = ((StringValue)arguments[1]).getStringValue();
String result = "";
if (value == null)
{
value = "";
}
result = value;
if (result.equals(""))
{
result = defaultValue;
}
return StringValue.makeStringValue(result);
}
};
}
}
我创建了一个如下所示的 Saxon 配置文件。我的示例看起来与 Saxon 网站上的示例略有不同,因为该示例在 class 名称后包含由 $ 分隔的函数名称 - 当我尝试它时,我收到一条错误消息,指出 Saxon 无法找到 class.
edition="HE"
licenseFileLocation=""
label="c4jMiddleware">
<resources>
<extensionFunction>com.commander4j.Transformation.XSLT_Ext_NVL</extensionFunction>
</resources>
</configuration>
我正在使用此语法加载配置。
Source xmlSource = new StreamSource(new File(System.getProperty("user.dir") + File.separator + "xml" + File.separator + "config" + File.separator +"SaxonConfiguration.xml"));
Configuration.readConfiguration(xmlSource);
下面是我的 XSLT 的摘录,它试图调用 java 函数。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:c4j="http://www.commander4j.com"
xmlns:c4j_XSLT_Ext_NVL="http://com.commander4j.Transformation.XSLT_Ext_NVL"
xmlns:c4j_XSLT_Ext="http://com.commander4j.Transformation.XSLTExtension"
exclude-result-prefixes="xs c4j c4j_XSLT_Ext" version="2.0">
<xsl:output encoding="UTF-8" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
.
.
.
<xsl:template match="xml">
<xsl:param name="pack_conv" select="c4j_XSLT_Ext_NVL:nvl($pack_conv_temp, '1')"/>
如果有人能告诉我哪里出错了,我将不胜感激。
戴夫
正如 Martin 所建议的,最可能的解释是您实际上并没有使用通过读取配置文件创建的配置。