Java 如何编写可以处理SequenceType.SINGLE\u字符串或SequenceType.EMPTY\u序列的Saxon ExtensionFunctionDefinition
我编写了一个Saxon HE扩展函数,如下所示Java 如何编写可以处理SequenceType.SINGLE\u字符串或SequenceType.EMPTY\u序列的Saxon ExtensionFunctionDefinition,java,saxon,Java,Saxon,我编写了一个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 n
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可以使用,但我正试图更多地理解SAXON Java代码,我想知道对该代码的更改是否意味着我对该扩展函数的所有调用都将通过一次更改而不是查找对它的所有调用来修复。首先声明参数类型,必要时声明结果类型,作为序列类型。可选字符串
其次,编写代码以处理
参数[0].head()
返回null的情况。首先声明参数类型,必要时将结果类型声明为序列类型。可选字符串
其次,编写代码以处理参数[0].head()
返回null的情况。如果它不起作用会发生什么,您会得到什么错误或结果,是在Java代码中还是在XSLT端?如果Java代码中出现异常,例如,参数[0]。head()
则捕获该异常,如果参数[0]。head()
返回null,则在调用getStringValue()之前检查该异常。如果该异常不起作用,会发生什么错误或结果,是在Java代码中还是在XSLT端?如果在Java代码中,例如,参数[0].head()
上出现异常,则捕获该异常,如果参数[0].head()
返回null,则在调用getStringValue()之前检查该异常。因此,我需要检查参数[0].head()是否为null-这意味着此时无法读取该值(可能应该重试)这与参数[0]不同。head().getStringValue();为null,这意味着从正在分析的XML返回的值丢失。我是否理解正确?参数[0]。如果参数的值为空序列,head()将为null。如果参数[0]。head()为非null,则序列至少包含一项。调用getStringValue()项上的参数将永远不会返回null,但如果该项是少数几种没有字符串值的项之一(例如,映射),它可能会引发异常。但是,您的代码只需处理与声明的参数类型匹配的参数。如果声明的类型为SequenceType.OPTIONAL_string,则可以保证参数[0].head()将为null(一个空序列),或者它将是xs:string的一个实例,在Java中由net.sf.saxon.value.StringValue
表示。如果XPath/XSLT调用程序提供了一些无效的内容,例如整数或映射,则saxon将检测到错误并不会调用您的函数。因此,我需要检查参数[0]。head()is null-这意味着该值在该时间点无法读取(可能应该重试),这与参数[0]不同。head().getStringValue();is null意味着从正在分析的XML返回的值丢失。我理解正确吗?参数[0]。head()如果参数的值为空序列,则将为null。如果参数[0].head()为非null,则该序列至少包含一项。调用getStringValue()项上的参数将永远不会返回null,但如果该项是少数几种没有字符串值的项之一(例如,映射),它可能会引发异常。但是,您的代码只需处理与声明的参数类型匹配的参数。如果声明的类型为SequenceType.OPTIONAL_string,则可以保证参数[0].head()将为null(一个空序列),或者它将是xs:string的一个实例,在Java中由net.sf.saxon.value.StringValue
表示。如果XPath/XSLT调用方提供了一些无效的内容,例如整数或映射,则saxon将检测到错误,并且不会调用您的函数。