类似于这个问题:如何获取声明的变量
我正在为 Java 扩展函数编写代码,需要从 XSL 中的命名空间声明中查找给定前缀的命名空间 URI。我已经了解了
context.getNamePool()
,但我无法弄清楚如何使用返回的 net.sf.saxon.om.NamePool (Saxon 9)。
函数调用(或任何其他表达式)的作用域内名称空间是该表达式的静态上下文的一部分,不能通过 Saxon 的
XPathContext
对象直接获得(仅包含动态上下文)。
您没有说明您使用哪个 API 来定义扩展函数(请参阅 https://www.saxonica.com/documentation12/index.html#!extensibility/extension-functions-J):
使用自反接口,静态上下文不可用于函数体。
同样,对于简单的界面,静态上下文不可用。
使用完整接口,即使用 s9api 方法
Processor.registerExtensionFunction(ExtensionFunctionDefinition)
定义的扩展函数,Saxon 在编译时调用 ExtensionFunctionDefinition.makeCallExpression
创建 ExtensionFunctionCall
对象,然后调用 ExtensionFunctionCall.supplyStaticContext()
提供静态上下文信息包括命名空间绑定。
使用此信息很复杂,因为通常,
StaticContext
对象可以解析命名空间的前缀,但它无法枚举具有已定义绑定的所有前缀。这是 Saxon 支持在 XPath 中绑定扩展函数的 JAXP 机制的结果,该机制使用了设计非常糟糕的 Java 接口javax.xml.namespace.NamespaceContext
。
顺便说一句,这与
NamePool
无关。 NamePool
保存有关 Configuration
中使用的全部名称的信息,并且不保存任何特定于单个表达式的上下文的信息。