如何在 Java 扩展函数中从 net.sf.saxon.expr.XPathContext 获取声明的命名空间

问题描述 投票:0回答:1

类似于这个问题:如何获取声明的变量

我正在为 Java 扩展函数编写代码,需要从 XSL 中的命名空间声明中查找给定前缀的命名空间 URI。我已经了解了

context.getNamePool()
,但我无法弄清楚如何使用返回的 net.sf.saxon.om.NamePool (Saxon 9)。

java xpath xslt saxon
1个回答
0
投票

函数调用(或任何其他表达式)的作用域内名称空间是该表达式的静态上下文的一部分,不能通过 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
中使用的全部名称的信息,并且不保存任何特定于单个表达式的上下文的信息。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.