我正在从Saxon 9.3 (PE)切换到更新的版本。我正在使用扩展函数(带有“Extension”)
我将参数定义为
public SequenceType[] getArgumentTypes() {
return new SequenceType[] {SequenceType.ANY_SEQUENCE, SequenceType.ANY_SEQUENCE, SequenceType.NODE_SEQUENCE, SequenceType.SINGLE_STRING};
}在XSLt中,调用是使用第一个参数的变量进行的,这是一个构建的XML节。
<xsl:variable name="graphXML">
<CHART>
<xsl:attribute name="FORMAT">PNG</xsl:attribute>
<xsl:attribute name="HEIGHT">
...
</xsl:variable>在呼叫时,
private static class GrapheurCall extends ExtensionFunctionCall {
private static final long serialVersionUID = 1L;
@Override
public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {我需要更改我的代码,因为ExtensionFunctionCall接口更改了(以前,我已经
public SequenceIterator call(SequenceIterator[] arguments, XPathContext context) throws XPathException { ...)
我现在有两个问题:
1)参数类型由SequenceIterator改为Sequence。正因如此
NodeInfo dataNode = (NodeInfo) arguments[0].next();不能再使用了,并且
NodeInfo dataNode = (NodeInfo) arguments[0];给我一个运行时错误
net.sf.saxon.value.SingletonItem cannot be cast to net.sf.saxon.om.NodeInfo尽管接收到的对象是一个TinyTree (根据在运行时完成的调试)。
2)返回值也不同(从SequenceIterator到Sequence)我之前返回了新的ListIterator(saxon_result);
这是不可能的(saxon_result是一个java.util.ArrayList ),在这里,我不知道如何将我的ArrayList作为序列发回……
有什么见多识广的人能对此有所了解吗?谢谢!Fabien
发布于 2018-08-11 01:37:15
从SequenceIterator到Sequence的更改是在9.5中完成的,并且是一般整理的一部分,其中包括引入Sequence类来组合以前的Value和ValueRepresentation。这里有一个(简短的)解释:http://www.saxonica.com/documentation9.5/index.html#!changes/spi/9.4-9.5.1。虽然我们试图尽量减少像这样的破坏性变化,但我们通常认为,当事情出错并扭曲了新功能的设计时,我们会以牺牲向后兼容性为代价来纠正它们。
我不确定您现在使用的是什么版本:SingletonItem类在9.5中存在,但在9.6中消失了;如果您继续前进,那么我建议直接移动到9.8。
最佳实践是这样做
NodeInfo dataNode = (NodeInfo) argument[0].head();无论参数的内部表示形式如何,它都会起作用。
https://stackoverflow.com/questions/51789090
复制相似问题