问题:尝试使用SpEL xpath构建正确的XPATH,以关联“名称”标记值,其中根标记具有命名空间但没有前缀。
错误:意外的令牌。预期'rparen())'但是'标识符' 它在抱怨& #39;我试图为xpath评估做一个单引号。
XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns="http://www.foo.com">
<id></id>
<Name>test</Name>
</root>
Spring Config
<aggregator
id="agg1"
input-channel="requestChannel"
output-channel="outputChannel"
discard-channel="garbageCanChannel"
ref="blah"
method="combine"
expire-groups-upon-completion="true"
correlation-strategy-expression="#xpath(payload, '//*[local-name()]='Name'/text()')"
release-strategy="blah"
release-strategy-method="timeToRelease"
send-partial-result-on-expiry="false"
send-timeout="60000"
group-timeout="60000"
/>
更新
所以在下载spring source并跟踪问题之后。似乎在下面方法中的标记化执行期间,Spring将“Name”视为标识符而不是字符串文字的一部分。至少这是工作实例和失败实例之间的区别。大概可能我没有正确地逃避它。
类别:InternalSpelExpressionParser.java 方法:doParseExpression
this.expressionString = "#xpath(payload, '//*[local-name()=Name]')"//This works
[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()=Name]'](16,45), [RPAREN())](45,46)]
this.expressionString = "#xpath(payload, '//*[local-name()='Name']')"//Thisfails
[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()='](16,35), [IDENTIFIER:Name](35,44), [LITERAL_STRING:']'](44,47), [RPAREN())](47,48)]
解决方案: ...
correlation-strategy-expression="#xpath(payload, '//*[local-name()=''Name'']/text()')"
正确的字符串文字: - 您可以看到它现在是正确的,因为标记化过程将所有内容放在字符串文字标记中。
[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()=''Name'']/text()'](16,56), [RPAREN())](56,57)]
其他调试说明:
在这里拉出弹簧棒时:
https://github.com/spring-projects/spring-framework
答案 0 :(得分:0)
您发布的表达式将产生无效的XPath。它应该在/text()
之前关闭方括号:
'//*[local-name()='Name']/text()'
或可能使用双单引号转义,如建议here:
'//*[local-name()=''Name'']/text()'