Saxon9: Как получить объявленные переменные из net.sf.saxon.expr.XPathContext в функции расширения Java

Я объявил несколько функций расширения Java, реализовав свою собственную библиотеку net.sf.saxon.functions.JavaExtensionLibrary и передав ее в net.sf.saxon.Configuration и, тем самым, в net.sf.saxon.TransformerFactoryImpl. Пока это работает нормально. Saxon передает объект net.sf.saxon.expr.XPathContext при вызове моих методов. Есть ли способ получить объявленные переменные xsl с их значениями и/или определениями из этого XPathContext? Мне удалось найти только глобальные переменные (объявленные на верхнем уровне таблицы стилей xsl), но не те, которые были объявлены позже в коде XSL. В идеале я хотел бы перечислить переменные.

Я получил глобальные переменные xsl, только вызвав

context.getController().getExecutable().getCompiledGlobalVariables()

Я надеялся получить аналогичную информацию для всех переменных, доступных на данный момент в коде XSL, даже если они были объявлены позже.

Какую именно версию Saxon вы используете?

Martin Honnen 17.04.2024 19:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны знать, что здесь вы имеете дело с внутренними API, которые могут меняться от версии к версии.

XPathContext.getStackFrame() предоставит вам текущий кадр стека, содержащий локальные переменные; но вам может потребоваться вернуться к контексту вызывающего абонента, используя XPathContext.getCaller(). У объекта StackFrame есть метод getStackFrameMap(), который предоставляет вам объект SlotManager, который содержит сопоставление имен переменных с целочисленными номерами слотов (имейте в виду, что несколько локальных переменных могут иметь одно и то же имя), а StackFrame.getStackFrameValues() дает вам массив, содержащий фактические значения переменных ( при условии, что они уже оценены).

При выполнении подобных действий существует множество потенциальных ловушек. Например, вы обнаружите, что некоторые локальные переменные выделяются системой (поддерживаются такие оптимизации, как подъем цикла), а некоторые из объявленных пользователем локальных переменных могут быть оптимизированы. Тот факт, что переменные иногда вычисляются лениво, создает дополнительные проблемы.

Большое спасибо за объяснение! Это позволит мне (с учетом упомянутых вами ловушек) создать XPathVariableResolver из XPathContext, чтобы оценивать выражения XPath в функции расширения Java. Есть ли способ получить выражение XPath, которое использовалось при объявлении переменной?

martin 18.04.2024 09:57

> Есть ли способ получить выражение XPath, которое использовалось при объявлении переменной? -- Это сложно. Вы могли видеть, к чему вас ведет XPathContext.getOrigin(); это может быть функция или шаблон, содержащий объявления переменных, дерево выражений которых будет доступно.

Michael Kay 19.04.2024 10:23

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