java - 如何编写可以处理 SequenceType.SINGLE_STRING 或 SequenceType.EMPTY_SEQUENCE 的 Saxon ExtensionFunctionDefinition
问题描述
我写了一个 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 选择传递给它的参数是空序列,否则它会起作用。
我可以修改下面的代码,以便它可以接受,如果遇到空序列,则将其视为空白字符串?
我已经确定在我的 XSLT 选择上使用 string(....) 强制转换是有效的,但我试图更多地理解 SAXON Java 代码,并且想知道对该代码的更改是否意味着我对这个的所有调用扩展功能将通过一次更改来修复,而不是追踪所有对它的调用。
解决方案
首先声明参数类型,必要时声明结果类型,如SequenceType.OPTIONAL_STRING
.
其次,编写代码以处理arguments[0].head()
返回 null 的情况。
推荐阅读
- azure - Azure SQL 数据库:使用复制活动将表从一个 Azure SQL 数据库传输/迁移到另一个 Azure SQL 数据库
- apache-kafka-connect - Confluent InfluxDB 接收器连接器
- build-process - 相对“SourceCodeDirectory”项目变量文件路径在 FinalBuilder 上不起作用
- bash - 使用 Bash 和 Curl 选择工作域
- powershell - 如何使用 PowerShell 格式化分区(不是卷)?
- matlab - 使用 Matlab 编码器动态和静态分配的正确方法是什么?
- ios - 无法使用类型为“(任何?,(错误?,DatabaseReference)-> Void)”的参数列表调用“setValue”
- excel - 图表数据系列格式不正确
- react-native - 如何在本机反应中创建表格
- r - 截断和合并两个字符向量中的值