【问题标题】:saxon extension function with NODE_SEQUENCE or ANY_SEQUENCE具有 NODE_SEQUENCE 或 ANY_SEQUENCE 的撒克逊扩展函数
【发布时间】:2018-08-10 14:51:19
【问题描述】:

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

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

【问题讨论】:

    标签: saxon extension-function


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,迈克尔。谢谢,这确实适用于 NodeInfo。但是,我仍然对返回值有疑问。如何将我的 ArrayList 转换为序列?我将根据您的建议切换到 9.8,因为它看起来很合理,但是,它确实导致了另一个编译问题,但我认为新帖子会更好(XPathEvaluator 上的方法 setSource 不存在。之前会进行一些搜索:) )。
    • 最简单的方法是将List&lt;String&gt;转换成List&lt;StringValue&gt;,通过转换每个字符串,然后使用SequenceExtent.makeSequenceExtent(List&lt;T&gt;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2015-02-21
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多