我们的情况是我们需要在模型中支持XPath 1.0和函数current()
(以及一些其他函数),但我们不会将数据作为XML文档。
我们编写了一个NodeInfo实现来处理非XML数据源问题。
但是,当我运行以下类型的表达时
/a/b/c[name = current()/../x]/yy/uu/name
通过将表示根的对象设置为文档对象,将另一个具有兄弟元素x的对象设置为上下文节点,我得到了错误
无法在非XSLT上下文中使用current()函数
当我调试时,我看到正在使用的上下文是standalonecontext。如何获得current()
功能的支持?我尝试将表达式更改为
/a/b/c[name = ./../x]/yy/uu/name
但是,.
被解释为c
。
答案 0 :(得分:1)
Saxon对一致性采取非常严格的态度,XPath规范不允许实现者添加自己的函数,除非在不同的命名空间中。 current()函数在XSLT中定义,函数的语义定义只在XSLT中有意义,尽管可以定义一个类似的函数用于独立的XPath表达式。在XPath的当前版本中,它实际上不再需要了,因为您可以使用“let”绑定变量(如Martin Honnen所示)。
如果您准备深入了解内部接口,那么Saxon允许您扩展可用的功能集。例如,有XForms实现使用下面的Saxon引擎,以及XForms规范中定义的其他函数。详细信息取决于您使用的Saxon版本:静态上下文是StandaloneContext的事实表明它是一个相当旧的版本。如果你使用9.7,它可能是一个IndependentContext。 IndependentContext具有方法getFunctionLibrary()
和setFunctionLibrary()
,可用于修改XPath解析器已知的函数集。但要完成这项工作,你必须对撒克逊人的内部相当熟悉。但是,如果你真的有义务以不符合的方式实现扩展XPath 1.0的规范,那么你没有很多选择。