当前位置: 首页 > 知识库问答 >
问题:

Saxon HE Java扩展函数(配置问题)

封烈
2023-03-14

我目前使用Saxon9开源版本,扩展用Java编写。我正在尝试迁移到SaxonHE,我已经阅读了这里显示的留档和示例。

Java扩展功能:全界面

Saxon配置文件

当我尝试执行我的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);
                }
            };
    }

}

我已经创建了一个撒克逊配置文件,看起来像这样。我的例子看起来有点不同于撒克逊网站上的例子,因为那个例子包括类名后面的函数名,用$分隔——当我尝试它时,我得到一个错误消息,撒克逊找不到这个类。

    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')"/>

如果有人能告诉我哪里出了问题,我将不胜感激。

戴夫

共有1个答案

羊舌兴文
2023-03-14

正如Martin所建议的,最有可能的解释是,您实际上没有使用通过读取配置文件创建的配置。

 类似资料:
  • 在针对PHPCMS V9做二次开发的时候,您可以自定义一些全局函数且不影响以后官方升级 您自定义的文件请放置于该文件中 phpcms\libs\functions\extention.func.php或者以.func.php格式命名,放置于如下目录中 phpcms\libs\functions\autoload

  • 我在Kotlin文件中定义了扩展函数。 其中是(生成的)java类。现在,我想用正常的java代码访问它: 然而,那是行不通的。IDE将无法识别方法,编译失败。

  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 function log(x, y) { y = y || 'World'; console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // He

  • 在我们的软件,我们使用spring Java配置。我们有一个设置,其中一个配置扩展了一个抽象配置。请看一下这个测试案例: 其思想是,覆盖了并且在创建的ApplicationContext中只有一个类型的bean位于名称之下。 结果是: 所以它说,有两个bean(两个实例--每个名称一个)--甚至更令人吃惊的是:创建这两个bean都使用了相同的方法()。 这种行为在我们看来很奇怪:我们希望sprin

  • 你可以通过 nuxt.config.js 文件中的 extend 配置项来扩展 Webpack 的配置: module.exports = { build: { extend (config, { isDev, isClient }) { // ... } } }