具有NODE_SEQUENCE或ANY_SEQUENCE

时间:2018-08-10 14:51:20

标签: saxon extension-function

我正在从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作为序列发回...

任何有知识的人都可以对此有所了解吗? 谢谢! 法比恩

1 个答案:

答案 0 :(得分:0)

SequenceIteratorSequence的更改是在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

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