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

Posted

技术标签:

【中文标题】Saxon-HE Java 扩展函数(问题配置)【英文标题】:Saxon-HE Java Extension Functions (Problem configuring) 【发布时间】:2021-06-02 21:15:48 【问题描述】:

我目前使用的是 Saxon9 开源版本,带有用 Java 编写的扩展。我正在尝试迁移到 SaxonHE,并且我已阅读此处显示的文档和示例。

Java extension functions: full interface

Saxon Configuration File

当我尝试执行我的 XSLT 转换时,当它遇到我的一个外部 java 函数时,我会遇到这样的错误。

  XPST0017: Cannot find a 2-argument function named
  Qhttp://com.commander4j.Transformation.XSLT_Ext_NVLnvl()

这就是我到目前为止所做的。

我的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 网站上的示例略有不同,因为该示例在类名之后包含函数名,以 $ 分隔 - 当我尝试它时,我收到一条错误消息,指出 Saxon 找不到该类。

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

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

戴夫

【问题讨论】:

你在哪里使用Configuration.readConfiguration(xmlSource)调用的结果,你使用new Processor(Configuration.readConfiguration(xmlSource))吗? 错误 - 好点 - 我想我错过了说明中的一些内容。我将不得不去看看如何做到这一点。谢谢 【参考方案1】:

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

【讨论】:

以上是关于Saxon-HE Java 扩展函数(问题配置)的主要内容,如果未能解决你的问题,请参考以下文章

Saxon-HE 集成扩展功能 |如何以及在哪里?

Saxon-HE 9.3 的 javax.xml.xpath.XPathFactory 提供程序配置文件中的语法错误

如何在 Saxon-HE 中获得 EXSLT 支持?

XSLT 函数返回不同的结果 [Saxon-EE vs Saxon-HE/PE]

旧光泽的 GKE 集群自动扩缩器配置文件

升级 saxon-he-10.5 JAR 后,面临转型问题