Oxygen中saxon:evaluate无法执行XPath3.1表达式,求配置或解决方案
问题描述
在Oxygen XML Editor 24.0中使用Saxon-EE XQuery 9.9,尝试通过saxon:evaluate执行XPath 3.1类型表达式,从解析后的JSON对象中取值。测试代码如下:
let $rawJ := <jroot><![CDATA[ { "siam_envelope": { "protocol_version": "1" } }]]> </jroot> let $j := parse-json($rawJ) let $expression := "$p1?siam_envelope?protocol_version" let $result := saxon:evaluate($expression, $j) return $result
预期返回值为"1",但报错:
Static error in XPath expression supplied to saxon:evaluate: The XPath parser is not configured to allow use of XPath 3.1 syntax
推测因使用了仅XPath 3.1支持的map类型语法,但报错提示未配置,询问是否有对应配置方法;若没有,如何在XQuery中运行动态XPath 3.1表达式?
解决方案
一、显式配置XPath语法版本
Saxon-EE 9.9原生支持XPath 3.1,但saxon:evaluate默认可能采用低版本语法规则,可通过以下方式指定:
- 代码层面修改:调用
saxon:evaluate时添加第三个参数,明确指定语法版本为"3.1",修改后的代码:
let $rawJ := <jroot><![CDATA[ { "siam_envelope": { "protocol_version": "1" } }]]> </jroot> let $j := parse-json($rawJ) let $expression := "$p1?siam_envelope?protocol_version" let $result := saxon:evaluate($expression, $j, "3.1") return $result
- Oxygen全局配置:进入
Options > Preferences > XML > XSLT-FO-XQuery > XQuery,选中对应的Saxon-EE 9.9处理器,将默认XPath语法版本设置为3.1。
二、使用XQuery 3.1原生动态求值
如果配置仍有问题,可直接使用XQuery 3.1的eval函数实现动态表达式执行,前提是确保XQuery环境启用3.1模式:
declare version "3.1"; let $rawJ := <jroot><![CDATA[ { "siam_envelope": { "protocol_version": "1" } }]]> </jroot> let $j := parse-json($rawJ) let $expression := "$p1?siam_envelope?protocol_version" let $result := eval($expression, map { "p1": $j }) return $result
注意:需在查询的prolog部分添加declare version "3.1";声明,同时在Oxygen的XQuery处理器设置中确认已启用XQuery 3.1支持。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

