1

我正在从 Saxon 9.3 (PE) 切换到更新的版本。我正在使用扩展函数(带有“扩展 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)我之前有return new ListIterator(saxon_result);

这不再可能(saxon_result 是 java.util.ArrayList )在这里,我不知道如何将我的 ArrayList 作为序列发回......

有知识的人能解释一下吗?谢谢!法比安

4

1 回答 1

1

SequenceIteratorto的更改Sequence是在 9.5 中进行的,并且是总体整理的一部分,其中包括引入Sequence类以结合以前的ValueValueRepresentation. 这里有一个(简短的)解释: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();

无论参数的内部表示如何,这都将起作用。

于 2018-08-10T17:37:14.773 回答