不能在非 XSLT 上下文中使用 current() 函数

Cannot use the current() function in a non-XSLT context

我们的情况是,我们需要在我们的模型中支持 XPath 1.0 和函数 current()(以及一些其他函数),但我们没有 XML 文档中的数据。 我们编写了一个 NodeInfo 实现来处理非 XML 数据源问题。

但是,当我 运行 以下类型的表达式时

/a/b/c[name = current()/../x]/yy/uu/name

通过将表示根的对象设置为文档对象并将另一个具有兄弟元素 x 的对象设置为上下文节点,我得到了错误

Cannot use the current() function in a non-XSLT context

我调试的时候看到使用的context是standalonecontext。如何获得对 current() 函数的支持?我尝试将表达式更改为

/a/b/c[name = ./../x]/yy/uu/name

但是,. 被解释为 c

Saxon 对一致性采取非常严格的态度,XPath 规范不允许实现者添加自己的函数,除非在不同的命名空间中。 current() 函数是在 XSLT 中定义的,并且该函数的语义是根据仅在 XSLT 中有意义的术语定义的,尽管我们当然可以定义一个类似的函数用于独立的 XPath 表达式。在当前版本的 XPath 中,它真的不再需要了,因为您可以使用 "let" 绑定变量(如 Martin Honnen 所示)。

如果您准备深入了解内部接口,那么 Saxon 允许您扩展可用的功能集。例如,有一些 XForms 实现使用底层的 Saxon 引擎,以及在 XForms 规范中定义的附加功能。细节将取决于您使用的是哪个 Saxon 版本:静态上下文是 StandaloneContext 的事实表明它是一个相当旧的版本。如果您使用的是 9.7,它可能是一个 IndependentContext。 IndependentContext 具有方法 getFunctionLibrary()setFunctionLibrary(),可用于修改 XPath 解析器已知的函数集。但是要完成这项工作,您必须相当熟悉 Saxon 的内部结构。但是,如果您真的有义务以不符合标准的方式实现扩展 XPath 1.0 的规范,那么您的选择就没那么多了。