首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NODE_SEQUENCE或ANY_SEQUENCE的saxon扩展函数

使用NODE_SEQUENCE或ANY_SEQUENCE的saxon扩展函数
EN

Stack Overflow用户
提问于 2018-08-10 22:51:20
回答 1查看 203关注 0票数 1

我正在从Saxon 9.3 (PE)切换到更新的版本。我正在使用扩展函数(带有“Extension”)

我将参数定义为

代码语言:javascript
复制
public SequenceType[] getArgumentTypes() {                  
        return new SequenceType[] {SequenceType.ANY_SEQUENCE, SequenceType.ANY_SEQUENCE, SequenceType.NODE_SEQUENCE, SequenceType.SINGLE_STRING};

    }

在XSLt中,调用是使用第一个参数的变量进行的,这是一个构建的XML节。

代码语言:javascript
复制
<xsl:variable name="graphXML">
                     <CHART>
                           <xsl:attribute name="FORMAT">PNG</xsl:attribute>
                           <xsl:attribute name="HEIGHT">
...
</xsl:variable>

在呼叫时,

代码语言:javascript
复制
 private static class GrapheurCall extends ExtensionFunctionCall {

            private static final long serialVersionUID = 1L;

            @Override
             public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {

我需要更改我的代码,因为ExtensionFunctionCall接口更改了(以前,我已经

代码语言:javascript
复制
 public SequenceIterator call(SequenceIterator[] arguments, XPathContext context) throws XPathException { ...

)

我现在有两个问题:

1)参数类型由SequenceIterator改为Sequence。正因如此

代码语言:javascript
复制
NodeInfo dataNode = (NodeInfo) arguments[0].next();

不能再使用了,并且

代码语言:javascript
复制
NodeInfo dataNode = (NodeInfo) arguments[0];

给我一个运行时错误

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2018-08-11 01:37:15

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。

最佳实践是这样做

代码语言:javascript
复制
NodeInfo dataNode = (NodeInfo) argument[0].head();

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51789090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档