问题描述
我有一个旧应用程序,我要从 Saxon-HE 9.2 升级到 9.5(希望升级到 9.8)。该应用程序实现了 Saxon Debugger
接口。升级到 9.5 后,Debugger
不再触发任何事件。我认为这可能是由于字节码优化,并将 GENERATE_BYTE_CODE
设置为 false。但是,我仍然没有收到调试事件。我相信我发现了问题,但不知道修复方法。在 9.2 中,InstructionInfo
有许多子类,包括 StyleElement
。我的代码期望某些 InstructionInfo
为 StyleElement
,但它们不是。
public class Saxon2TraceListener implements TraceListener {
// implement interface
public void enter(InstructionInfo instruction,XPathContext context)
{
if (!(instruction instanceof StyleElement))
return;
// do logic with StyleElement
}
}
如何从 InstructionInfo 获取 StyleElement?
解决方法
恐怕当您使用这样的低级接口时,阅读和理解源代码是无可替代的。 9.2 和 9.5 都是不受支持的版本,无论如何,这是我们只真正向付费客户提供的那种支持 - 我们必须在某处划清界限。
我认为实际的 Debugger
接口已经过时了一段时间。它最初的想法是允许您使用占据每个插槽的变量名称来注释堆栈帧,但现在这是标准产品功能,不需要自定义调试器。
您似乎在谈论 TraceListener
接口,它在后续版本中肯定会发生变化,这是不可避免的,因为它使您可以访问已编译样式表的内部表示,这是我们一直在调整的内容。
我不确定 9.5 或 9.8 中的情况,但在 10.x 中,TraceListener.enter()
和 TraceListener.leave()
的参数已从 InstructionInfo
更改为 {{1 }},每个表达式和指令都是一个Traceable
。
Traceable
是源样式表树状表示中的一个节点,并且源样式表在运行时不再存在,无论您是否正在跟踪/调试。