Саксонское представление оценок XPath - PullRequest
0 голосов
/ 11 июля 2019

В Apache Xalan и процессоре .NET XSLT оценки XPath могут быть представлены DTMNodeIterator и XPathNodeIterator, соответственно. Есть ли у саксанцев эквивалент?

1 Ответ

1 голос
/ 11 июля 2019

Дизайн в саксонской отличается, но есть много точек сходства.

В Saxon, на уровне системного программирования, который большинству пользователей не нужно беспокоиться, у объекта Expression есть метод Expression.iterate(context), который возвращает SequenceIterator. Поскольку это XPath 2.0 / 3.1, а не 1.0, SequenceIterator может возвращать любые элементы (узлы, атомарные значения или функции), а не только узлы. Есть много внутренних реализаций SequenceIterator; Одним из наиболее важных является AxisIterator, который всегда используется для навигации по деревьям XDM, обычно с использованием осей XPath.

На уровне s9api, который разработан как API для типичных пользовательских приложений, исполняемое выражение XPath представляется объектом XPathSelector. Это Iterable, поэтому вы можете использовать синтаксис for (Item item : selector) вместо явного использования итератора; если вы используете метод iterator, тогда он фактически возвращает XdmSequenceIterator<XdmItem>, но для всех практических целей вы можете использовать его как java.util.Iterator<XdmItem>, где XdmItem - это узел, атомное значение или функция.

Saxon 9.9 также представляет потоковый API, который имеет сходство с Linq. Это позволяет вам перемещаться по дереву с использованием функциональных интерфейсов Java: теперь вы можете писать такие вещи, как:

for (XdmNode pack : testInput.select(
            child("package").where(attributeEq("role", "secondary"))).asListOfNodes() {
           ...
}

, который полностью скрывает лежащие в основе итераторы. Это эквивалентно итерации по результату выражения XPath package[@role='secondary'], но экономит затраты на компиляцию выражения, которые часто намного превышают затраты на выполнение.

...