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

使用com.schibsted.spt.data编译含中间变量的JSLT表达式报错求助

问题描述

在Java中使用com.schibsted.spt.data库编译带中间变量的JSLT表达式时遭遇编译错误,以下是两次尝试及对应错误信息:

尝试1

String jsltExpression = "let parts = split(.id, \"/\") { \"result\": parts[1] + parts[3] }";
Expression jslt = Parser.compileString(jsltExpression);

错误信息

com.schibsted.spt.data.jslt.JsltException: Parse error: Encountered " "[" "[ "" at line 1, column 46.
Was expecting:
    "(" ...
     at <inline>:1:41
    at com.schibsted.spt.data.jslt.parser.ParserImpl.compileExpression(ParserImpl.java:62)
    at com.schibsted.spt.data.jslt.Parser.compile(Parser.java:226)
    at com.schibsted.spt.data.jslt.Parser.compileString(Parser.java:86)
    at com.schibsted.spt.data.jslt.Parser.compileString(Parser.java:74)

尝试2

String jsltExpression = "{ \"result\": let(parts = split(.id, \"/\")) parts[1] + parts[3] }";
Expression jslt = Parser.compileString(jsltExpression);

错误信息

com.schibsted.spt.data.jslt.JsltException: Parse error: Encountered " "let" "let "" at line 1, column 13.
Was expecting one of:
    <INTEGER> ...
    <DECIMAL> ...
    <STRING> ...
    "[" ...
    "{" ...
    "true" ...
    "false" ...
    "." ...
    "if" ...
    "(" ...
    <IDENT> ...
    <PIDENT> ...
    <VARIABLE> ...
     at <inline>:1:11
    at com.schibsted.spt.data.jslt.parser.ParserImpl.compileExpression(ParserImpl.java:62)
    at com.schibsted.spt.data.jslt.Parser.compile(Parser.java:226)
    at com.schibsted.spt.data.jslt.Parser.compileString(Parser.java:86)
    at com.schibsted.spt.data.jslt.Parser.compileString(Parser.java:74)

疑问:该库是否支持编译带中间变量的JSLT表达式?是否存在相关限制?


解答

com.schibsted.spt.data.jslt库完全支持带有中间变量的JSLT表达式,你的问题是JSLT语法书写错误导致的,而非库的限制。

正确的表达式写法

JSLT中let变量声明的标准语法要求必须搭配return关键字,用于指定变量声明后要执行的表达式。针对你的需求,正确的写法如下:

String jsltExpression = "let parts = split(.id, \"/\") return { \"result\": parts[1] + parts[3] }";
Expression jslt = Parser.compileString(jsltExpression);

错误原因解析

  1. 尝试1的问题:缺少return关键字。JSLT语法规定,let声明变量后必须通过return明确后续要执行的逻辑,否则解析器无法识别变量声明后的代码块。
  2. 尝试2的问题:let是顶层/块级的变量声明语句,不能直接嵌套在对象属性的赋值位置,必须先完成变量声明,再返回使用该变量的对象结构。

补充说明

该库对JSLT标准语法的支持是完整的,除了let变量声明,还支持条件判断、自定义函数、数组操作等特性,只要严格遵循JSLT语法规范,就能正常编译执行。


内容的提问来源于stack exchange,提问作者eduizquierdo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:02:14