微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编写可以处理 SequenceType.SINGLE_STRING 或 SequenceType.EMPTY_SEQUENCE

如何解决如何编写可以处理 SequenceType.SINGLE_STRING 或 SequenceType.EMPTY_SEQUENCE

我写了一个 Saxon HE 扩展函数如下

package com.commander4j.Transformation;

import com.commander4j.util.Utility;

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_trim extends ExtensionFunctionDeFinition
{

    @Override
    public SequenceType[] getArgumentTypes()
    {
        return new SequenceType[]{SequenceType.SINGLE_STRING};
    }
    
    @Override
    public StructuredQName getFunctionQName()
    {
        return new StructuredQName("c4j_XSLT_Ext_trim","http://com.commander4j.Transformation.XSLT_Ext_trim","trim");
    }

    @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;
                    try
                    {
                        value =  arguments[0].head().getStringValue();
                    } catch (ClassCastException ex)
                    {
                       value = "";  
                    }
                    
                    String result = Utility.replaceNullStringwithBlank(value);

                    return StringValue.makeStringValue(result);
                }
            };
    }

}

除非从我的 Xsql select 传递给它的参数是一个空序列,否则它会起作用。

我可以修改下面的代码,使其接受其中之一,如果遇到空序列,将其视为空字符串吗?

我已经确定在我的 XSLT select 上使用 string(....) cast 有效,但我试图更多地理解 SAXON Java 代码,并且想知道对该代码的更改是否意味着我所有的对这个扩展函数调用将通过一次更改来修复,而不是搜索所有对它的调用

解决方法

首先声明参数类型,必要时声明结果类型为SequenceType.OPTIONAL_STRING

其次,编写代码以处理 arguments[0].head() 返回 null 的情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。