我通过实现我自己的net.sf.saxon.functions. Java ExtensionLibrary并将其传递给net.sf.saxon.配置,从而传递给net. sf. saxon. TransformerFactoryImp来声明了几个Java扩展函数.到目前为止,这效果很好. 当调用我的方法时,Saxon传递net.sf.saxon.expr. XPathContent对象.有没有方法可以从此XPathContent获取声明的xsl变量及其值和/或定义?我只能找到全局变量(在xsl样式表的顶层声明),但找不到后面在XSL代码中声明的变量.理想情况下,我想列举变量.

我只能通过调用

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

我希望获得TLR代码中当时可用的所有变量的类似信息,即使它们是后来声明的.

推荐答案

您需要注意,您正在处理的内部API可能会在不同版本之间发生变化.

XPathContext.getStackFrame()将为您提供包含局部变量的当前堆栈框架;但您可能需要使用XPathContext.getCaller()返回调用者的上下文.StackFrame对象有一个方法getStackFrameMap(),该方法为您提供一个SlotManager对象,该对象保存从变量名称到integer slot号的映射(请注意,几个局部变量可能具有相同的名称),StackFrame.getStackFrameValues()为您提供一个包含实际变量值的数组(假设它们已经被判断).

做这种事情有很多潜在的trap .例如,您会发现一些局部变量是系统分配的(支持循环提升等优化),而一些用户声明的局部变量可能已被优化.变量有时被懒惰判断,这一事实带来了额外的挑战.

Java相关问答推荐

Maven Google Sheets版本问题

Java Stream,需要更新列表对象列表

使用Java Streams API比较两个不同的Java集合对象和一个公共属性

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

只需最少的代码更改即可将版本号标记添加到日志(log)

基于调车场算法的科学计算器

如何让DTO接受空字符串字段,但如果它们不为空,则应用JPA验证?

GetChildren().emoveAll()不会删除 node

如何使用Criteria Builder处理一对多关系中的空值?

如何在Java springboot中从一个端点发送多个时间响应?

从12小时开始的日期模式

Oracle中从JSON中提取和插入数据

如何设计包含已知和未知键值对映射的Java类?

";home/runner/work/中没有文件...匹配到[**/pom.xml];Maven项目的构建过程中出现错误

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

当我try 返回可选时,Mock无法正常工作

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为

为什么child-pom会创建一个新版本

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为

为什么 log4j 过滤器在appender中不起作用