Как я могу узнать, действительно ли пишущий XSLT 3.0, который я пишу, передает XML? - PullRequest
0 голосов
/ 05 февраля 2020

Только то, что написано на банке.

Я новичок в XSLT 3.0. Я рад попробовать, потому что большая часть моей работы связана с относительно простыми операциями с огромными XML файлами.

Я обнаружил, что есть несколько реквизитов для XML для потока, но я не совсем уверен в том, что они есть, и не очень уверен в своей способности писать XSLT (компилятор мой любимый инструмент отладки).

Как я могу определить, действительно ли написанный мной XSLT выполняет потоковую передачу XML, а не работает правильно, но не в потоковом режиме?

1 Ответ

1 голос
/ 05 февраля 2020

Если вы запрашиваете потоковую передачу (например, <xsl:mode streamable="yes"/>) и используете Saxon 9.8 или 9.9 EE (пока единственные реализации, поддерживающие эту часть XSLT 3), тогда он выполнит анализ исправности вашего кода во время компиляции таблицы стилей и сообщит Вы использовали ли какие-либо конструкции, которые он не считает пригодными для обработки.

По крайней мере, так будет, если вы запустите Saxon из командной строки. Внутри oXygen я думаю, вам явно нужно запросить в Saxon EE указанные c параметры сценария преобразования, которые вы хотите использовать потоковую передачу (см. https://www.oxygenxml.com/doc/versions/21.1/ug-editor/topics/advanced-saxon-xslt-options-x-publishing2.html?hl=streaming и параметр «Включить режим потоковой передачи»).

Как и в большинстве конфигураций Saxon, есть также возможность использовать файл конфигурации http://saxonica.com/html/documentation/configuration/configuration-file/.

Если вы запрашиваете потоковую передачу в своем коде и запускаете Saxon EE из командной строки тогда он не выполнит код, если не считает его пригодным для обработки.

Это грубый обзор, подробности см. http://saxonica.com/html/documentation/sourcedocs/streaming/.

Кроме того, как только вы получите анализ стримабельности, вы можете использовать опцию -t в командной строке, она покажет, какой синтаксический анализатор используется для какого входного документа и построено ли дерево или оно обрабатывается с помощью потоковой передачи.

По моему опыту, вам нужно переучиваться, как использовать XSLT, если вы хотите использовать потоковую передачу, многие методы, которые вы могли бы использовать (xsl:call-template, хранение узлов в переменных), могут не работать если вы имеете дело с чистой потоковой передачей. Часто есть способ смешать потоковую передачу с традиционной обработкой на основе дерева, используя copy-of() и / или snapshot(). Существуют также новые функции, такие как аккумуляторы, которые помогают сделать ваш код пригодным для обработки, например, если вы используете их вместо xsl:number или вместо ключей.

...