You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:15:23