Функция расширения saxon с node_sequence или any_sequence

Я перехожу с 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
180
1

Ответы 1

Переход с SequenceIterator на Sequence был сделан в версии 9.5 и был частью общей уборки, которая включала введение класса Sequence для объединения предыдущих Value и ValueRepresentation. Здесь есть (краткое) объяснение: 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 <String> в последовательность? Я перейду на 9.8 в соответствии с вашим предложением, поскольку это кажется разумным, однако это вызвало еще одну проблему с компиляцией, но я предполагаю, что новый пост будет лучше (метод setSource в XPathEvaluator не существует. ).

Fabien 13.08.2018 09:59

Самый простой - преобразовать List<String> в List<StringValue>, преобразовав каждую строку, а затем использовать SequenceExtent.makeSequenceExtent(List<T>).

Michael Kay 13.08.2018 18:24

Другие вопросы по теме