我正在从Saxon 9.3(PE)切换到最新版本。 我正在使用扩展功能(带有“ extends ExtensionFunctionDefinition”)
我的参数定义为
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作为序列发回...
任何有知识的人都可以对此有所了解吗? 谢谢! 法比恩
答案 0 :(得分:0)
从SequenceIterator
到Sequence
的更改是在9.5中进行的,并且是常规整理的一部分,其中包括引入Sequence
类以结合先前的{{1 }}和Value
。这里有一个简短的解释:http://www.saxonica.com/documentation9.5/index.html#!changes/spi/9.4-9.5.1。当我们尝试最小化此类破坏性更改时,我们通常认为,当出现问题并扭曲新功能的设计时,我们会将其正确设置,但会向后兼容。
我不确定您现在正在使用哪个发行版:ValueRepresentation
类在9.5中存在,但在9.6中消失了;如果您正在前进,那么我建议直接移至9.8。
最佳实践是
SingletonItem
无论参数的内部表示形式如何,都将起作用。